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

x86_64汇编中GAS绝对间接远跳转语法的疑问

x86-64 JMP指令疑问解答

核心疑问拆解与解答

1. 0x64是FS段前缀,而非REX.W

0x64是FS段前缀,用于指定后续内存操作数访问FS段空间。REX前缀的范围是0x40~0x4F,专门用于64位模式下扩展寄存器、操作数宽度等,和段前缀属于完全不同的指令前缀类型。

2. 三条待解读指令的具体含义(均不属于JMP m16:64)

逐个分析你给出的反汇编指令:

  • 地址0xb的指令:64 ff 24 25 0f 00 00 00 → jmp QWORD PTR fs:0xf
    这是带FS段前缀的近跳转,从FS段的绝对地址0xf处读取8字节(64位)指针,然后跳转到该指针指向的地址。属于JMP m64的变种(带段前缀),仅修改RIP,不改变CS寄存器。
  • 地址0x13的指令:64 67 ff 20 → jmp QWORD PTR fs:[eax]
    其中0x67是地址大小前缀,强制在64位模式下使用32位地址寻址(因此用eax而非rax)。这条指令同样是近跳转,从FS段中eax指向的地址读取8字节指针并跳转,属于带段前缀+地址大小前缀的JMP m64。
  • 地址0x17的指令:64 ff 60 17 → jmp QWORD PTR fs:[rax+0x17]
    带FS段前缀的近跳转,从FS段中rax+0x17指向的地址读取8字节指针并跳转,同样属于JMP m64的变种。

3. JMP m16:64的本质与区别

Jump far, absolute indirect, address given in m16:64是64位模式下的远跳转指令,核心特点:

  • 指令格式:需要REX.W前缀(0x48)+ 操作码ff /5 + 内存寻址方式
  • 内存操作数内容:存储16位段选择子 + 64位偏移地址(共10字节)
  • 执行效果:同时修改CS寄存器(加载内存中的16位段选择子)和RIP(加载内存中的64位偏移),属于跨段跳转操作,通常用于特权级切换、访问特殊段(如TSS)等场景,用户态代码极少用到。

和近跳转指令的核心区别:

  • 近跳转:仅修改RIP,CS保持不变,属于同段内跳转
  • JMP m16:64:同时修改CS和RIP,是跨段跳转

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:54:33