x86-64指令集下call [edi+0x21]指令是否合法?
x86-64下
call [edi+0x21]合法性解答 这条指令在x86-64指令集下是合法的,在线编解码器的输出正确,是你对Intel手册的理解存在偏差。
核心原因如下:
- 你提到的「FF /2仅对r/m64生效」指的是64位模式下
call r/m指令的操作数宽度要求,即从内存中读取的跳转目标地址必须是64位,这和寻址时使用的地址宽度没有关联,二者是独立的参数。 - 编码开头的
67是地址大小覆盖前缀:x86-64模式下默认地址宽度为64位,添加67前缀后会临时切换为32位地址宽度,允许使用32位通用寄存器作为寻址基址,这里的edi就是32位寻址模式下的合法基址寄存器。 - 你拿到的编码
67 ff 57 21完全符合编码规则,可逐段拆解验证:67:地址大小覆盖前缀,启用32位寻址ff:通用操作码字节,配合ModR/M的扩展位区分具体指令0x57:ModR/M字节,拆分后:- Mod域为
01:表示寻址模式为「基址寄存器 + 8位立即数偏移」 - 操作码扩展域为
010:对应FF /2的编码规则,匹配call指令 - R/M域为
111:对应32位寻址模式下的基址寄存器edi
- Mod域为
0x21:8位偏移量,和前面的寻址组合正好对应[edi+0x21]
额外说明:这条指令执行时,32位寻址计算得到的地址会被零扩展为64位再进行内存访问,只要对应低4GB地址空间的内存位置合法可访问,指令就可以正常运行,不存在编码层面的错误。
内容的提问来源于stack exchange,提问作者user1432882
相关产品推荐
相关产品推荐

