4

我正在Assembly 8086 中制作一个太空入侵者,用于测试我正在使用DOSBox。让我向您展示我的代码:

;--------------------
;Update hero
;--------------------
update:
call vsync
call update_hero ; method to read keyboard
call set_video
call clear_screen
call draw_hero
jmp update

现在程序 update_hero 是:

update_hero proc
     mov ah, 01h
     int 16h
     cmp al, 97
     je left_pressed
     cmp al, 100
     jne none_pressed
     inc hero_x
     left_pressed:
          dec hero_x
     none_pressed:
     ret
update_hero endp

如您所见,我正在尝试为运动读取“a”或“d”,但是,它不起作用,您能帮我找出原因吗?

我正在尝试做的是从键盘读取而不等待它,这就是我使用 subfunction 的原因ah, 01h

干杯。

编辑

我在这里检查了中断,修改了代码,现在它可以工作了:

update_hero proc
    mov ah, 01h ; checks if a key is pressed
    int 16h
    jz end_pressed ; zero = no pressed

    mov ah, 00h ; get the keystroke
    int 16h

    begin_pressed:
        cmp al, 65
        je left_pressed
        cmp al, 97
        je left_pressed
        cmp al, 68
        je right_pressed
        cmp al, 100
        je right_pressed
        cmp al, 81
        je quit_pressed
        cmp al, 113
        je quit_pressed
        jmp end_pressed
        left_pressed:
            sub hero_x, 2
            jmp end_pressed
        right_pressed:
            add hero_x, 2
            jmp end_pressed
        quit_pressed:
            jmp exit
    end_pressed:

    ret
update_hero endp
4

3 回答 3

3

您只是在检查是否有可用的字符,但实际上并没有从缓冲区中读取字符。因此,下次您检查时,它仍然存在。

从这个关于 BIOS 功能的页面http://webpages.charter.net/danrollins/techhelp/0230.HTM

INT 16H,AH=1

Info: Checks to see if a key is available in the keyboard buffer, and
      if so, returns its keycode in AX.  It DOES NOT remove the
      keystroke from the buffer.
于 2012-10-30T17:26:57.740 回答
0

check_key:

mov     ah, 1

int     16h

jz      .ret 

mov     cx, 0

xor     cl, ch

mov     ah, 0

int     16h

.new.key:

"al" 是新的 key presh

.ret:

 ret
于 2013-07-12T12:04:41.110 回答
0
update_hero proc
 mov ah, 01h
 int 16h
 cmp al, 97
 je left_pressed
 cmp al, 100
 jne none_pressed
 inc hero_x

ret ; without the ret instruction "hero_x" will be decrease after increasing

 left_pressed:
      dec hero_x
 none_pressed:
 ret
update_hero endp
于 2014-02-27T07:08:14.950 回答