我想在行中移动一个char(最初为row = 0),如果该行为50,它将停止。但是它没有按预期工作。
可能由于lea dx
而行不通,并且行值位于dl
中。
dosseg
.model small
.stack 100h
.data
snake db ">$"
.code
main proc
mov ax, @data
mov ds, ax
mov ah, 06h
mov al, 0
mov ch, 0
mov cl, 0
mov dh, 24
mov dl, 79
mov bh, 00001100b
int 10h
mov dl, 5
lb1:
mov ah, 02h
mov bh, 0
mov dh, 5
int 10h
inc dl
lea dx, snake
mov ah, 2
int 21h
cmp dl, 50
jbe lb1
mov ah, 4ch
int 21h
main endp
end main
答案 0 :(得分:1)
我想在[初始行= 0]行中移动一个字符,如果该行是[row = 50],它将停止
您是否知道您的程序更改了列而不是行?
lea dx, snake mov ah, 2 int 21h
以上代码会破坏您在DL
中的列的事实可以通过两种方式纠正:
。在堆栈上保留DL
push dx
lea dx, snake
mov ah, 09h
int 21h
pop dx
。请勿使用其他输出函数破坏DL
mov cx, 1
mov bh, 0
mov al, '>'
mov ah, 0Ah
int 10h
要获得移动感,您需要将对象移至其旧位置:
lb1:
mov cx, 1
mov bh, 0
mov al, ' ' ;Remove at old place
mov ah, 0Ah
int 10h
inc dl ;Goto to new place (next column)
mov dh, 5 ;Row 5, Column in DL
mov bh, 0
mov ah, 02h
int 10h
mov cx, 1
mov bh, 0
mov al, '>' ;Show at new place
mov ah, 0Ah
int 10h
cmp dl, 50
jbe lb1
因为一切都会如此迅速地发生,所以您实际上看不到运动!显示对象后,您需要暂停一下。
作为一种快速的替代方法,我将使用等待按键的操作:
lb1:
mov cx, 1
mov bh, 0
mov al, ' ' ;Remove at old place
mov ah, 0Ah
int 10h
inc dl ;Goto to new place (next column)
mov dh, 5 ;Row 5, Column in DL
mov bh, 0
mov ah, 02h
int 10h
mov cx, 1
mov bh, 0
mov al, '>' ;Show at new place
mov ah, 0Ah
int 10h
mov ah, 00h ;Wait for a keystroke.
int 16h
cmp dl, 50
jbe lb1