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
问题排查
除法逻辑完全错误
原代码中除法部分意图计算Val1/2并从中间结果中减去该值,但实际执行时:- 执行
div ecx时,eax仍为之前的中间结果,而非Val1 div指令的被除数是EDX:EAX(64位组合),此时EDX保存的是中间结果,导致计算的是(EDX<<32 | EAX)/2,完全偏离需求- 无符号除法要求
EDX清零,否则会得到错误结果
- 执行
缺少程序终止指令
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
相关产品推荐
相关产品推荐

