You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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两个字节,反汇编时的计算逻辑:
    1. 指令eb fe位于地址0x0。
    2. 下一条指令的地址为0x0 + 2 = 0x2(短跳转指令长度为2字节)。
    3. 偏移量0xfe是十进制的-2,因此目标地址 = 下一条指令地址 + 偏移 = 0x2 + (-2) = 0x0。
  • 所以objdump反汇编结果jmp 0x0是完全正确的,它和jmp -2的逻辑等价——跳转到当前指令的起始地址,形成原地循环。

内容的提问来源于stack exchange,提问作者user1994405

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:54:56