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

汇编语言实现字符串屏幕横移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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:27:25