尝试在装配8086

时间:2019-04-17 10:33:02

标签: animation assembly x86-16

我想在行中移动一个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

1 个答案:

答案 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