大多数情况下是的,一行汇编对应于一条 CPU 指令。但有一些注意事项。
标签定义不对应于任何指令 - 它们只是标记内存,以便您可以在其他地方引用它。标签绝对不对应于指令,即使在某些汇编器下它们占据单独的行。
数据指令如db 0x90
or .byte 0x90
手动将字节组装到输出文件中。在执行将到达的区域中使用此类指令可以让您手动编码指令,或者如果您不小心这样做的话会产生错误。
汇编器通常支持指令 - 为汇编器本身提供一些指导的行。这些与 CPU 指令不对应,有时会被误认为是真正的命令。
一些汇编器支持宏 - 想想内联函数。
一些 RISC 汇编器,尤其是 MIPS,有组合指令的概念 - 一行汇编对应于少量指令。 (这些称为伪指令。)它们就像内置宏,由汇编器提供。
但根据操作数,它可能只需要汇编成 1 条机器指令。例如li $t0, 1
可以组装到ori $t0, $zero, 1
but li $t0, 0x55555555
两者都需要lui
and ori
(or addiu
).
On ARM, ldr r0, =0x5555
可以在来自文字池的 PC 相关负载或movw
如果为支持的 ARM CPU 进行汇编movw
带有 16 位立即数。你不会看到ldr r0, =0x5555
在反汇编中,您会看到汇编器选择来实现它的任何机器指令。 (编者注:我不确定是否有任何 ARM 汇编器会选择 2 条指令(movw
+ movk
)对于更广泛的常数ldr reg, =value
)
您是否将过程调用视为“每行多条指令”?有CALL
关于英特尔,BL
在ARM上。就 CPU 文档而言,这些是单个指令。它们只是在某处存储返回地址的分支。
但是如果你正在调试和单步执行over函数调用而不是into它们调用可能包含任意多条指令的过程/函数/子例程。系统调用也是如此:类似的指令syscall
or svc #0
基本上是对内核的函数调用。
汇编程序肯定可以使用操作系统的服务。您认为常规程序如何做到这一点?无论高级程序能做什么,汇编也能做什么。但具体情况有所不同。