如何修复基于Irvine32库的汇编程序死循环及光标定位异常问题
问题根源
你的代码存在两个核心问题导致运行异常:
- 循环计数器被意外改写:x86架构下
loop指令依赖ECX寄存器存储循环次数,你在读取用户姓名的逻辑中直接给ECX赋值为输入缓冲区长度,覆盖了最初设置的循环次数3,导致循环无法正常退出,出现无限死循环。 - 迭代结束清屏逻辑缺失:原代码仅在循环开头清屏,最后一次循环运行完成后没有执行清屏操作,不符合需求。
修正后代码
INCLUDE Irvine32.inc .data prompt1 BYTE "Enter Your Name:",0 var1 byte 20 DUP(?) bytecount DWORD ? prompt BYTE "Enter Integer:",0 resultMsg BYTE "Sum of the two integers is:",0 Int1 DWORD ? Int2 DWORD ? Sum DWORD ? .code main PROC MOV ECX,3 L1: call Clrscr ; 定位光标到屏幕中央 MOV DH,13 MOV DL,40 CALL GoToXY MOV EDX,OFFSET prompt1 Call WriteString MOV EDX,OFFSET var1 ; 保存当前ECX存储的循环计数 PUSH ECX MOV ECX,sizeof var1 Call ReadString ; 恢复ECX的循环计数值 POP ECX MOV EDX, OFFSET prompt CALL WriteString CALL ReadInt MOV Int1,EAX CALL WriteString CALL ReadInt MOV Int2,EAX ; 计算两数之和 MOV EAX,Int1 ADD EAX,Int2 MOV Sum,EAX ; 输出计算结果 MOV EDX, OFFSET resultMsg call WriteString MOV EAX,Sum call WriteInt call Crlf call WaitMsg loop L1 ; 最后一次迭代结束后清屏 call Clrscr exit main ENDP END main
修改说明
- 在读取用户姓名的逻辑前后补充了
PUSH ECX和POP ECX,避免循环计数被覆盖,彻底解决无限死循环问题 - 循环退出前补充
call Clrscr,满足每次迭代结束后清屏的需求 - 修复后每次循环都会先清屏再重新定位光标到屏幕中央,光标定位异常的问题同步解决
内容的提问来源于stack exchange,提问作者Motswailana
相关产品推荐
相关产品推荐

