MASM 64位汇编32位立即数符号扩展错误检测及易出错指令查询
x64 触发imm32自动符号扩展的完整指令列表
以下所有指令均满足「目标操作数为64位寄存器/内存,源操作数为32位立即数(imm32)」的格式,只要传入的立即数落在0x80000000 ~ 0xFFFFFFFF区间,MASM就会自动对其做符号扩展,生成高32位全为1的64位立即数编码。
# 算术运算类 add r64/m64, imm32 adc r64/m64, imm32 sub r64/m64, imm32 sbb r64/m64, imm32 imul r64, r64/m64, imm32 # 逻辑运算类 and r64/m64, imm32 or r64/m64, imm32 xor r64/m64, imm32 # 比较测试类 cmp r64/m64, imm32 test r64/m64, imm32 # 数据传送类 mov r64/m64, imm32 # 栈操作类 push imm32
补充说明
- 你遇到的比较失效问题是典型触发场景:
SOCKET_ERROR_INT EQU 0FFFFFFFFh落在符号扩展区间,cmp qword ptr [rbp-8], imm32匹配上述指令格式,立即数被扩展为0xFFFFFFFFFFFFFFFF,和内存中存储的0x00000000FFFFFFFF不相等,导致跳转逻辑失效。 - 规避方案可直接修改常量定义,显式声明为64位无扩展形式:
SOCKET_ERROR_INT EQU 00000000FFFFFFFFh,即可强制汇编器不做符号扩展。
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

