汇编指令是否将1-1映射到机器语言?

blu*_*ote 3 assembly cpu-architecture machine-code

我正在同时阅读各种有关计算机体系结构的书籍,我感到困惑。一些书指出,汇编指令只是机器指令的助记符,每条指令恰好对应于一条机器指令。但是,Tanenbaum的结构化计算机组织将程序集放置在操作系统之上,并且似乎暗示程序集以某种方式使用了操作系统(我尚未阅读整本书...)

哪一个是对的?组装说明仅仅是机器说明吗?它们也可以是操作系统解释为机器指令的系统调用吗?他们还能成为别的东西吗?

Sev*_*yev 5

通常是的,汇编的一行对应一条CPU指令。但是有一些警告。

标签定义与任何指令都不对应-它们只是标记内存,以便您可以在其他地方引用它。标签绝对不符合指令,即使在某些汇编器下它们占用单独的行。

数据伪指令类似db 0x90.byte 0x90手动将字节组装到输出文件中。在执行将到达的区域中使用此类指令,可以使您手动编码指令,或者如果您意外地创建了指令,则可以创建错误。

汇编程序通常支持指令-这些行为汇编程序本身提供了一些指导。这些命令与CPU指令不符,有时可能会误认为是真正的命令。

一些汇编程序支持宏-考虑内联函数。


一些RISC汇编器,尤其是MIPS,具有组合指令的概念-一条汇编线对应于少数指令。(这些称为伪指令。)它们类似于汇编程序提供的内置宏。

但是根据操作数,可能只需要汇编为1条机器指令即可。例如li $t0, 1可以组装到,ori $t0, $zero, 1但同时li $t0, 0x55555555需要luiori(或addiu)。

在ARM上,ldr r0, =0x5555可以从文字池中选择PC相对负载,也可以选择movw是否为支持movw16位立即数的ARM CPU组装。您不会ldr r0, =0x5555在反汇编中看到,您会看到汇编器选择用来实施该指令的任何机器指令。(编者注:我不确定是否有任何ARM汇编程序会选择2条指令(movw+ movk)来表示的更广泛的常数ldr reg, =value


您将过程调用算作“每行多条指令”吗?CALL在英特尔,BLARM 上都有。就CPU文档而言,这些只是单一说明。它们只是分支,也将返回地址存储在某个地方。

但如果你正在调试,并加强函数调用,而不是他们,他们调用过程/函数/子程序,它可以包含任意多的指令。syscall也是如此:诸如syscallsvc #0基本上是对内核的函数调用之类的指令。

汇编程序肯定可以使用来自操作系统的服务。您如何看待常规程序呢?高层程序可以做什么,汇编也可以。具体细节有所不同。