【发布时间】:2016-08-27 20:37:11
【问题描述】:
我目前正在研究使用 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似乎使用单个字节作为操作数,这是为什么呢?
【问题讨论】:
-
指令被编码为 ADD r/m32, imm8 。由于 5 适合一个字节,因此汇编程序选择以这种方式对其进行编码。值 5 将符号扩展为 32 位并存储在目标中。
-
已存储 = 添加了哎呀。