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

汇编语言程序输出异常求助:输入三数仅重复打印首个数值

问题分析与修复

你的程序出现重复打印首个数值的问题,根源在于两个核心错误:

错误1:输入值存储逻辑错误

ReadDec函数读取用户输入的十进制数后,始终将结果存入EAX寄存器,但你在存储第二个、第三个数时,错误地把EBX、ECX的值存入valueB、valueC,这导致后两个变量根本没拿到用户输入的数值,而是存储了寄存器里的残留值。

错误2:输出调用逻辑错误

WriteDec函数仅会读取**EAX寄存器中的值**进行打印,你在打印后两个数时,只是把valueB、valueC加载到EBX、ECX,却没有将它们移动到EAX,所以每次调用WriteDec都是在打印EAX中保留的valueA值。


修正后的完整代码

.data
  promptFirstNum  BYTE "First number: ", 0
  promptSecondNum BYTE "Second number: ", 0
  promptThirdNum  BYTE "Third number: ", 0

  ; 声明用户输入的存储变量
  valueA  DWORD ?
  valueB  DWORD ?
  valueC  DWORD ?

.code
main PROC
  ; 读取第一个数并存入valueA
  MOV   EDX, OFFSET promptFirstNum
  call  WriteString
  call  ReadDec
  MOV   valueA, EAX

  ; 读取第二个数并存入valueB
  MOV   EDX, OFFSET promptSecondNum
  call  WriteString
  call  ReadDec
  MOV   valueB, EAX  ; 修正:将EAX(ReadDec的结果)存入valueB

  ; 读取第三个数并存入valueC
  MOV   EDX, OFFSET promptThirdNum
  call  WriteString
  call  ReadDec
  MOV   valueC, EAX  ; 修正:将EAX(ReadDec的结果)存入valueC
  call  CrLf
  call  CrLf

  ; 依次打印三个数
  MOV   EAX, valueA
  call  WriteDec
  MOV   EAX, valueB  ; 修正:将valueB加载到EAX,供WriteDec读取
  call  WriteDec
  MOV   EAX, valueC  ; 修正:将valueC加载到EAX,供WriteDec读取
  call  WriteDec
  call  CrLf

Invoke ExitProcess,0; 退出程序
main ENDP
END main

关键修改点说明

  • 输入阶段:所有ReadDec后的存储操作,都将EAX的值存入对应的变量(valueB、valueC),确保用户输入被正确保存。
  • 输出阶段:每次调用WriteDec前,都将需要打印的变量加载到EAX寄存器,保证WriteDec能读取到正确的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:52:43