汇编指令addl使用byte而不是long

时间:2016-08-27 20:37:12

标签: c gcc assembly objdump

我正在研究使用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似乎对操作数使用了一个字节,为什么会这样?

1 个答案:

答案 0 :(得分:4)

对immediates进行操作的许多指令可以是8位立即数,也可以是32位立即数(mov r/m32,i32显然不会)。此设计的目的可能是减少代码大小。但是,立即隐式地将符号扩展为32位。在add的情况下,操作码83 /0add,立即为8位,操作码81 /0add,立即为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