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

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
    • 0x21:8位偏移量,和前面的寻址组合正好对应[edi+0x21]

额外说明:这条指令执行时,32位寻址计算得到的地址会被零扩展为64位再进行内存访问,只要对应低4GB地址空间的内存位置合法可访问,指令就可以正常运行,不存在编码层面的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:57:04