【问题标题】:Moving Text program in Assembly Language汇编语言中的移动文本程序
【发布时间】:2016-11-07 15:17:10
【问题描述】:

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

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

我正在使用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。只是汇编语言的初学者,所以如果您提出解决方案,请保持简单易懂。 这是我到目前为止所尝试的。

【问题讨论】:

  • 你使用的是什么版本的程序集?
  • 我不确定您所说的程序集版本是什么意思。能详细点吗?
  • 根据您的架构,有许多不同版本的汇编语言。 nasm 中比较流行的汇编程序之一。
  • @JoseManuelAbarcaRodríguez 这是一个错误。它实际上是 st1
  • 那个问题是“你使用什么汇编器(编译它)以及目标平台是什么?” (我猜是 MASM 或 TASM 和 DOS 16b 实模式)。顺便说一句,我会先学习如何直接写入显存,如果你想做“屏幕保护程序”,那你为什么要多烧 10 倍 CPU(BIOS 调用输出文本模式字符效率极低且速度慢)。 stackoverflow.com/a/40018198/4271923

标签: assembly x86 emu8086 x86-16


【解决方案1】:

两个问题:

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

这是你的代码修复:

.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 

【讨论】:

  • 分秒必争,你早几秒就回答了 :-)
【解决方案2】:
mov DL, 79
mov DH, 24     <-- here Dh = 24
int 10H

ADD BL,1

cmp DH,23      <- so here condition never true
jz label2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多