You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编语言:如何将有符号数-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

问题分析与解决方法

  1. 核心问题:idiv是带符号除法指令,计算后余数的符号会和被除数保持一致。当被除数为负数时,余数也会是负数,这就导致你输出小数部分时出现-3的错误。

  2. 具体修正步骤:

    • 在第一次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,就能得到正确的正小数位。
  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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:23:34