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
相关产品推荐
相关产品推荐

