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

如何修复基于Irvine32库的汇编程序死循环及光标定位异常问题

问题根源

你的代码存在两个核心问题导致运行异常:

  1. 循环计数器被意外改写:x86架构下loop指令依赖ECX寄存器存储循环次数,你在读取用户姓名的逻辑中直接给ECX赋值为输入缓冲区长度,覆盖了最初设置的循环次数3,导致循环无法正常退出,出现无限死循环。
  2. 迭代结束清屏逻辑缺失:原代码仅在循环开头清屏,最后一次循环运行完成后没有执行清屏操作,不符合需求。

修正后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:36:02