箭头命中数字游戏。箭头未达到定义的数字

时间:2019-02-10 13:07:39

标签: assembly x86-16

我正在8086汇编程序Windows 10上用汇编语言编写一个简单的游戏。该程序接受用户的输入。箭头出现在输入数字处,而不是水平转到该数字,而是向下移动。我要箭头击中那个数字。我找到了this个游戏,但我听不懂。请指导我哪里我错了。如有可能,请提供详细说明。

Screenshot

.model small
.stack 100h
.data
str db "Enter number to hit: $"
arrow db "--->>$"
my db 0
.code
main proc
    mov ax, @data
    mov ds, ax

    sub cx, cx

    mov cl, 9
    mov al, '1'
    mov dh, 1
    l1:
        mov ah, 02
        mov dl, 79
        mov dh, dh
        mov bx, 0
        int 10h

        mov ah, 02
        mov dl, al
        int 21h

        inc dh
        inc al
    loop l1

    mov ah, 02
    mov dl, 0
    mov dh, 0
    mov bx, 0
    int 10h

    lea dx, str
    mov ah, 09
    int 21h

    mov ah, 01
    int 21h
    mov my, al

    mov bp, 0
    l2:
        mov ah, 02
        mov dl, bp
        mov dh, my
        mov bx, 0
        int 10h

        mov ah, 02
        mov dl, ' '
        int 21h

        lea dx, arrow
        mov ah, 09
        int 21h

        inc bp
    loop l2

    mov ah, 4ch
    int 21h
    main endp
end main

1 个答案:

答案 0 :(得分:1)

mov ah, 01
int 21h
mov my, al

此输入为您提供一个字符,因此从“ 1”到“ 9”。
您的代码需要使用它代表的数字,即1到9。
您需要减去48才能做到这一点:

mov ah, 01
int 21h
sub al, '0'    ; This subtracts 48
mov my, al

mov bp, 0
l2:
...
loop l2

此循环无法正常工作,因为您忘记初始化CX寄存器。
在知道箭头的长度和屏幕的宽度的情况下,设置CX=74将起作用:

    mov bp, 0
    mov cx, 74
l2:
    ...
    loop l2

mov dl, bp    ????????
mov dh, my

您的汇编器将不接受mov dl, bp指令!您不能将16位寄存器移到8位寄存器中。
您可以在这里写的是:

mov dx, bp  ; 16-bit into 16-bit
mov dh, my  ; 8-bit into 8-bit