MASM汇编函数返回结果异常求助:预期-33实际得65503
问题分析与解决
问题原因
你遇到的问题是16位寄存器结果未符号扩展为32位导致的:
- 汇编代码中,
idiv cx执行后,商存储在16位寄存器AX中,AX = -33对应的16位补码是0xFFED。 - C++中声明的
Tester2()返回32位int类型,x86调用约定下返回值通过32位寄存器EAX传递。但你仅对AX赋值,EAX的高16位默认保持为0,最终EAX = 0x0000FFED,对应十进制的65503,而非预期的-33。
解决方案
在ret指令前添加cwde指令,将16位AX的符号位扩展到32位EAX的高16位,确保返回值正确符号扩展:
; 修改后的汇编代码 Tester2 proc mov ax, -100 cwd mov cx, 3 idiv cx cwde ; 新增:将AX符号扩展到EAX ret Tester2 endp end
验证说明
cwde指令会根据AX的最高位(符号位)填充EAX的高16位:当AX为负数(最高位1)时,EAX的高16位会被设为全1,此时EAX = 0xFFFFFFED,对应32位有符号整数的-33,与预期一致。
内容的提问来源于stack exchange,提问作者eve
相关产品推荐
相关产品推荐

