汇编语言程序输出异常求助:输入三数仅重复打印首个数值
问题分析与修复
你的程序出现重复打印首个数值的问题,根源在于两个核心错误:
错误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
相关产品推荐
相关产品推荐

