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

汇编指令CMP ESI, -20:为何双字寄存器ESI与字节值比较?

关于x86汇编中CMP指令与JA跳转的疑问

汇编代码片段

76EB750D   83FE E0          CMP ESI,-20
76EB7510   0F87 AD000000    JA msvcrt.76EB75C3

问题

为何双字寄存器ESI会与字节值进行比较?

测试情况:

  • 当ESI的值为FFFFFFF0时,跳转执行
  • 当ESI的值为FFFFF0F0时,跳转不执行
  • 当ESI的值为000000F0时,跳转不执行

解答

这是x86指令集的特性:83 FE E0属于CMP r32, imm8指令格式,它会自动将8位立即数符号扩展为32位(和目标寄存器位数匹配)后再执行比较。这里的E0是十进制-20的8位补码,符号扩展到32位后就是FFFFFFE0,实际是用ESI和这个32位值做比较。

再看跳转指令JA,它是无符号数大于则跳转的条件指令,把每个ESI值和FFFFFFE0按无符号数对比:

  • FFFFFFF0(无符号值4294967280)> FFFFFFE0(无符号值4294967264),满足JA条件,跳转执行
  • FFFFF0F0(无符号值4294936784)< FFFFFFE0,不满足条件,跳转不执行
  • 000000F0(无符号值240)< FFFFFFE0,不满足条件,跳转不执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:27:06