GNU x86汇编器跳转编码疑问:为何未生成短跳转指令?
汇编与反汇编两个问题的解析
问题1:jmp -2为何生成长跳转编码而非短跳转
GNU汇编器(GAS)默认不会自动将相对跳转优化为最短指令格式,核心原因如下:
- 当你编写
jmp -2时,GAS默认生成32位相对跳转指令(操作码e9),它优先使用通用的32位偏移范围,而非自动尝试优化为8位短跳转。 - 若要强制生成短跳转,必须显式指定指令长度,使用
jmp short -2的语法,此时汇编器才会输出eb fe的短跳转编码。 - GAS的设计逻辑是“显式优先”,避免隐含优化可能引发的意外行为,只有开发者明确指定时才会使用更窄的指令格式。
问题2:手动生成的eb fe为何反汇编显示jmp 0x0
这是x86短跳转的偏移计算规则导致的:
- 短跳转(操作码
eb)的8位偏移是相对于下一条指令的地址,而非当前指令地址。 - 你的二进制文件仅包含
eb fe两个字节,反汇编时的计算逻辑:- 指令
eb fe位于地址0x0。 - 下一条指令的地址为
0x0 + 2 = 0x2(短跳转指令长度为2字节)。 - 偏移量
0xfe是十进制的-2,因此目标地址 = 下一条指令地址 + 偏移 =0x2 + (-2) = 0x0。
- 指令
- 所以objdump反汇编结果
jmp 0x0是完全正确的,它和jmp -2的逻辑等价——跳转到当前指令的起始地址,形成原地循环。
内容的提问来源于stack exchange,提问作者user1994405
相关产品推荐
相关产品推荐

