assembly - 汇编语言中的移动文本程序

标签 assembly x86 emu8086 x86-16

我正在尝试用汇编语言编写一个程序,在该程序中我想像屏幕保护程序一样移动屏幕上的文本或字符,即,首先它应该向前和向下移动。当它到达屏幕的下限时,它应该开始向前和向上移动,反之亦然。

我自己尝试过,我已经能够同时向前和向下移动角色。当角色到达屏幕下限时,我希望它向上和向前移动,但我似乎不知道该怎么做。

我正在使用 emu8086 汇编器

.model small
.data
st1 db "O",13,10,'$'
.code
main proc
    mov AX,@data
    mov DS,AX 

    mov BL,0
    label1:
    mov AH,2H
    mov BH,0            ;goto-XY
    mov DH,BL
    mov DL,BL
    INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    ADD BL,1

    cmp DH,23           ;conditional jump
    jz label2
    loop label1 

    label2:

   ; mov AH,2H
   ; mov BH,0            ;goto-XY
   ; mov DH,BL
   ; mov DL,BL
   ; INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    SUB BL,1
    loop label2

    mov AH,4CH
    INT 21H
end main 

在第一个循环的每次迭代结束时,我检查“DH”是否= 23,因为我的屏幕 y 轴的下限是 23。如果达到屏幕的下限,它应该跳转到“label2” '但它不会跳到'label2',这显然是因为我没有正确使用'cmp'语句。 谁能帮我解决这个问题?

我需要帮助的主要问题是我应该检查“label1”以跳转到“label2”的条件。

PS。只是汇编语言的初学者,因此如果您建议解决方案,请保持简单易懂。 这是我到目前为止所尝试过的。

最佳答案

两个问题:

  • 您将 DH23 进行比较,以了解是否到达屏幕底部,但当您清除屏幕时,DH 会丢失。您应该比较 BL
  • 取消注释该 block 以定位光标。

这是您已修复的代码:

.model small
.data
st1 db "O",13,10,'$'
.code
main proc
    mov AX,@data
    mov DS,AX 

    mov BL,0
    label1:
    mov AH,2H
    mov BH,0            ;goto-XY
    mov DH,BL
    mov DL,BL
    INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    ADD BL,1

    cmp BL,23         ;◄■■■ COMPARE BL, NOT DH, BECAUSE
    jz label2         ;     YOU LOST DH WHEN CLEARED SCREEN.
    loop label1 

    label2:

    mov AH,2H           ;◄■■■ UNCOMMENT THIS BLOCK !!!
    mov BH,0            ;goto-XY
    mov DH,BL
    mov DL,BL
    INT 10H

    mov AH,9H
    mov DX,offset st1      ;print
    INT 21H

    mov AH, 6H 
    mov AL, 0    
    mov BH, 7         ;clear screen 
    mov CX, 0
    mov DL, 79
    mov DH, 24
    int 10H

    SUB BL,1
    cmp BL,1         ;◄■■■ PERSONAL CHANGE : DETECT WHEN
    jz label1        ;     CURSOR REACHES THE TOP ☻
    loop label2

    mov AH,4CH
    INT 21H
end main 

关于assembly - 汇编语言中的移动文本程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40468575/

相关文章:

linux - 获取 C++ 代码的 x86 指令大小?

assembly - 在程序集中向左或向右移动字符

assembly - Insight 调试器在寄存器中显示错误值

linux - 程序集 x86(32 位),调用 NR_creat (8) 破坏文件名存储

c - SSE 字节和半字交换

assembly - 防止 AX 寄存器被 DIV 指令破坏

c - RDTSCP 与 RDTSC + CPUID

assembly - 每个 asm 指令的大小是多少?

assembly - EMU8086 将 32 位数字除以 16 位数字给出意外的 0 余数

assembly - 如何检查emu8086中CF标志是否为1?