我正在研究使用objdump从简单的c程序编译的汇编代码,但这让我很困惑:
4004f1: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp)
4004f8: 83 45 fc 05 addl $0x5,-0x4(%rbp)
说明中的'l'前缀不是很长,因为movl看起来很好,但是addl似乎对操作数使用了一个字节,为什么会这样?
答案 0 :(得分:4)
对immediates进行操作的许多指令可以是8位立即数,也可以是32位立即数(mov r/m32,i32
显然不会)。此设计的目的可能是减少代码大小。但是,立即隐式地将符号扩展为32位。在add
的情况下,操作码83 /0
为add
,立即为8位,操作码81 /0
为add
,立即为32位。您的汇编器应自动选择最短编码。您可以组装这个小片段,然后反汇编结果以观察差异:
.byte 0x83,0xc0,0x00 # addl $0,%eax with an 8 bit immediate
.byte 0x81,0xc0,0x00,0x00,0x00,0x00 # addl $0,%eax with a 32 bit immediate