汇编语言:如何将有符号数-3转为无符号数3?新手求助
汇编语言中处理带符号余数,输出正确小数结果的问题
我输入整数进行计算后需要输出实数结果,比如输入1、23、123时,第二个计算的输出是-33.-3,但正确结果应该是-33.3。请问怎么把有符号数-3转换成无符号数3?我是汇编新手,求帮忙,附上我的MASM32代码:
include \masm32\include\masm32rt.inc .code start: call main exit main proc LOCAL var1:DWORD LOCAL var2:DWORD LOCAL var3:DWORD LOCAL tong:DWORD LOCAL result:DWORD LOCAL remainder:DWORD LOCAL a:DWORD LOCAL b:DWORD LOCAL e:DWORD LOCAL d:DWORD mov var1, sval(input("Enter number 1: ")) mov var2, sval(input("Enter number 2: ")) mov var3, sval(input("Enter number 3: ")) mov result, 0 mov e, 10 print chr$("v1 + v2 + v3 = ") mov eax, var1 add eax, var2 add eax, var3 mov tong, eax print str$(tong) print chr$(13,10) print chr$("[(v1 * v2) - v3] / 3 = ") mov eax, var1 cdq Imul var2 cdq mov a, eax sub eax, var3 mov b, eax mov edx, 0 mov eax, b cdq mov ecx, 3 Idiv ecx mov result, eax mov remainder, edx mov eax, remainder Imul e mov d, eax mov edx, 0 mov eax, d cdq mov ecx, 3 idiv ecx mov remainder, ax mov al, byte remainder mov ah, 0 add ax, 1234 mov remainder, ax print str$(result) print chr$(".") print str$(remainder) ret main endp end start
问题分析与解决方法
核心问题:
idiv是带符号除法指令,计算后余数的符号会和被除数保持一致。当被除数为负数时,余数也会是负数,这就导致你输出小数部分时出现-3的错误。具体修正步骤:
- 在第一次
idiv得到余数后,判断余数是否为负,若是则取反得到绝对值:mov result, eax mov remainder, edx ; 检查余数符号,取绝对值 test remainder, remainder jns remainder_non_neg ; 余数非负则跳过 neg remainder ; 余数为负则取反 remainder_non_neg: - 你代码中
mov al, byte remainder、add ax,1234这部分完全多余,会破坏余数的正确值,直接删除即可。 - 处理小数部分时,用取绝对值后的余数乘以10再除以3,就能得到正确的正小数位。
- 在第一次
修正后的核心代码段:
print chr$("[(v1 * v2) - v3] / 3 = ") mov eax, var1 imul var2 sub eax, var3 mov b, eax cdq mov ecx, 3 idiv ecx mov result, eax mov remainder, edx ; 取余数的绝对值 test remainder, remainder jns skip_neg neg remainder
skip_neg:
; 计算第一位小数 mov eax, remainder imul e cdq idiv ecx mov remainder, eax print str$(result) print chr$(".") print str$(remainder) ret
修改后,输入1、23、123时,`(1*23-123)=-100`,除以3得到商-33、余数-1,取反余数为1,1*10/3=3,最终输出`-33.3`,符合预期。 内容的提问来源于stack exchange,提问作者Sơn Nguyễn
相关产品推荐
相关产品推荐

