汇编语言实现字符串屏幕横移5次停止的代码错误排查
汇编实现字符串横向移动动画的问题修复
你判断的pop cx位置本身没有栈平衡问题,实际故障由3处逻辑错误导致:
- 外层循环入口位置错误:当前
dem:标签放在外层计数初始化语句mov cx,5之前,每次执行loop dem跳回标签后都会重新将cx赋值为5,外层计数永远无法递减到0,直接造成程序无限循环。 - 列坐标未重置:每轮移动启动前没有将列坐标变量
col重置为0,第一轮移动结束后col已经累加到79,后续轮次打印位置直接超出屏幕可视范围,就会出现“移动半次就跳回最左侧”的现象。 - 单轮移动次数不足:屏幕文本行共支持0-79合计80个列位置,当前内层循环仅设置79次计数,最后一列的画面不会被渲染,导致动画不完整。
修复后的完整代码:
.model small .stack .data strg db 'Test$' row db 12 col db 0 .code main proc mov ax,@data mov ds,ax mov cx,5 ; 外层循环5次的初始化仅执行1次 dem: push cx ; 入栈保护外层循环计数 mov col,0 ; 每轮移动开始前列坐标重置为0 mov cx,80 ; 内层循环80次,覆盖全列0-79位置 again: push cx ; 入栈保护内层移动循环计数 ; 清屏 mov ah,6 mov al,0 mov bh,7 mov ch,0 mov cl,0 mov dh,24 mov dl,79 int 10h ; 设置光标位置 mov ah,2 mov bh,0 mov dh,row mov dl,col int 10h ; 打印字符串 mov ah,9 mov dx, offset strg int 21h inc col ; 延时逻辑 mov cx,1 y: push cx mov cx,0ffffh x: loop x pop cx loop y pop cx ; 恢复内层移动循环计数 loop again pop cx ; 恢复外层循环计数 loop dem ; 退出程序 mov ah,4ch int 21h main endp end main
如果觉得移动速度太快,可以调整延时部分mov cx,1中的立即数,数值越大延时越长,移动速度越慢。
内容的提问来源于stack exchange,提问作者ent1ty
相关产品推荐
相关产品推荐

