x86汇编数组求和异常:预期100000h却得到A0000求助
汇编计算结果异常问题解析
问题描述
我定义了一个DWORD类型变量:var2 DWORD 10000h,20000h,30000h,40000h,对应的汇编程序如下:
.data var2 DWORD 10000h,20000h,30000h,40000h .code main PROC mov eax, 0 mov ebx, 0 mov ecx, 0 mov edx, 0 mov eax, [var2] mov ebx, [var2+4] mov ecx, [var2+8] mov edx, [var2+12] add eax,ebx add ecx, edx add ecx, eax call DumpRegs exit main ENDP END main
按计算逻辑10000h + 20000h + 30000h + 40000h,我预期得到100000h并存储在ECX寄存器中,但实际运行后ECX的值为A0000h。尝试更换寄存器、将结果存入变量再移入寄存器,问题仍未解决。
问题原因与解答
你的程序运行结果是正确的,问题出在你对十六进制加法的预期计算错误:
- 十六进制中,数字10用字符
A表示,因此1h+2h+3h+4h=Ah - 所有变量都是
xxxx0000h格式,因此总和为Ah后接4个0,即A0000h
你误以为结果是100000h,是混淆了十进制与十六进制的计数规则:十进制的10对应十六进制的Ah,而非10h(十六进制10h等于十进制的16)。四个变量的总和换算为十进制是655360,对应十六进制就是A0000h,和程序运行结果完全一致。
你的代码逻辑没有问题:
eax = 10000h + 20000h = 30000hecx = 30000h + 40000h = 70000hecx = 70000h + 30000h = A0000h
如果确实需要得到100000h,需调整变量值,例如将最后一个数改为60000h,此时10000h+20000h+30000h+60000h=100000h。
内容的提问来源于stack exchange,提问作者Akshit Sharma
相关产品推荐
相关产品推荐

