汇编语言中的移动文本程序
Moving Text program in Assembly Language
我正在尝试用汇编语言编写一个程序,我想在其中像屏幕保护程序一样在屏幕上移动文本或字符,即,首先它应该向前和向下移动。当它到达屏幕的下限时,它应该开始向前和向上移动,反之亦然。
我自己试过了,我已经能够同时向前和向下移动角色了。当角色达到屏幕的下限时,我希望它向上和向前移动,但我似乎不知道该怎么做。
我正在使用 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。只是汇编语言的初学者,所以如果您提出解决方案,请保持简单易懂。
这是我到目前为止尝试过的方法。
两个问题:
- 您将
DH
与 23
进行比较以了解是否到达屏幕底部,但是当您清除屏幕时 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
mov DL, 79
mov DH, 24 <-- here Dh = 24
int 10H
ADD BL,1
cmp DH,23 <- so here condition never true
jz label2
我正在尝试用汇编语言编写一个程序,我想在其中像屏幕保护程序一样在屏幕上移动文本或字符,即,首先它应该向前和向下移动。当它到达屏幕的下限时,它应该开始向前和向上移动,反之亦然。
我自己试过了,我已经能够同时向前和向下移动角色了。当角色达到屏幕的下限时,我希望它向上和向前移动,但我似乎不知道该怎么做。
我正在使用 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。只是汇编语言的初学者,所以如果您提出解决方案,请保持简单易懂。 这是我到目前为止尝试过的方法。
两个问题:
- 您将
DH
与23
进行比较以了解是否到达屏幕底部,但是当您清除屏幕时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
mov DL, 79
mov DH, 24 <-- here Dh = 24
int 10H
ADD BL,1
cmp DH,23 <- so here condition never true
jz label2