汇编指令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
相关产品推荐
相关产品推荐

