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

MASM615/Win32汇编代码无控制台输出或报错问题求助

汇编代码运行无输出问题排查

我仅通过6周短学期学习汇编语言,对汇编知识仍感困惑。这份代码经修正后运行,命令提示符仅显示空白,无结果或报错,预期十进制结果为12417。

原代码

TITLE AssignmentP2 (Mult.asm)
; This program calculates the value using the following data
; Val1 = 340d
; Val2 = A3Ch
; Val3 = 45h
; FinalVal = -(Val1 – Val3) + 1 + (Val2 * 3) + 1 + 1 – 2 -1– (Val1 / 2)

INCLUDE Irvine32.inc
INCLUDE macros.inc  ; Include macros for WriteDec and Crlf

.data
Val1 dword 340d
Val2 dword 0A3Ch
Val3 dword 45h

.code
main proc
    mov eax, [Val1]  ; Load Val1 into eax
    sub eax, [Val3]  ; Subtract Val3 from eax
    neg eax          ; Negate eax (2's complement)
    inc eax          ; Add 1 to eax
    mov ebx, [Val2]  ; Load Val2 into ebx
    imul ebx, 3      ; Multiply ebx by 3
    add eax, ebx     ; Add ebx to eax
    inc eax          ; Add 1 to eax
    inc eax          ; Add 1 to eax
    sub eax, 2       ; Subtract 2 from eax
    dec eax          ; Subtract 1 from eax

    mov edx, eax     ; Preserve the result in edx
    mov ebx, [Val1]  ; Load Val1 into ebx
    mov ecx, 2       ; Divisor (2)
    div ecx          ; Divide eax by ecx (Val1 / 2)
    mov ecx, eax     ; Store the result (Val1 / 2) in ecx
    mov eax, edx     ; Restore the preserved result into eax

    call WriteDec    ; Call WriteDec to print the result

main endp

end main

问题排查

  1. 除法逻辑完全错误
    原代码中除法部分意图计算Val1/2并从中间结果中减去该值,但实际执行时:

    • 执行div ecx时,eax仍为之前的中间结果,而非Val1
    • div指令的被除数是EDX:EAX(64位组合),此时EDX保存的是中间结果,导致计算的是(EDX<<32 | EAX)/2,完全偏离需求
    • 无符号除法要求EDX清零,否则会得到错误结果
  2. 缺少程序终止指令
    Irvine32框架下,main过程末尾未调用exit或ret,会导致程序执行异常,无法正常输出结果。

修正后的代码

TITLE AssignmentP2 (Mult.asm)
; This program calculates the value using the following data
; Val1 = 340d
; Val2 = A3Ch
; Val3 = 45h
; FinalVal = -(Val1 – Val3) + 1 + (Val2 * 3) + 1 + 1 – 2 -1– (Val1 / 2)

INCLUDE Irvine32.inc
INCLUDE macros.inc  ; Include macros for WriteDec and Crlf

.data
Val1 dword 340d
Val2 dword 0A3Ch
Val3 dword 45h

.code
main proc
    ; 计算 -(Val1 - Val3) + 1
    mov eax, [Val1]
    sub eax, [Val3]
    neg eax
    inc eax

    ; 加上 (Val2 * 3)
    mov ebx, [Val2]
    imul ebx, 3
    add eax, ebx

    ; 处理 +1 +1 -2 -1
    inc eax
    inc eax
    sub eax, 2
    dec eax

    ; 保存当前中间结果到ebx
    mov ebx, eax

    ; 计算 Val1 / 2(无符号除法)
    mov eax, [Val1]
    xor edx, edx  ; 清零EDX,满足无符号除法的高位要求
    mov ecx, 2
    div ecx       ; EAX = Val1 / 2,EDX = Val1 % 2

    ; 用中间结果减去 Val1/2
    sub ebx, eax
    mov eax, ebx

    ; 打印结果并换行
    call WriteDec
    call Crlf

    ; 终止程序
    exit
main endp

end main

额外说明

修正后代码的计算结果为7419,与预期的12417不符,建议检查公式的书写或数值定义是否存在偏差(例如是否将十六进制值误作十进制处理)。

内容的提问来源于stack exchange,提问作者Nicholas Tam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:34:49