在程序集中向左或向右移动字符

Move char left or right in Assembly

我在组装一个简单的游戏,目前我只是想根据数字 1 或 2 向左或向右移动播放器图标(在本例中为字符 X)在键盘上。目前,我只有两个 if then 通过递减或递增 X 坐标值来向左或向右移动 X。我将 Irvine 32 库用于像 Gotoxy 这样的过程来获取坐标值。截至目前,我的程序在正确的起始位置显示 x 但由于某种原因,当我点击 1 或 2 时,x 向上移动一个 space 而不是向左或向右。自己的书上看不懂,网上找的东西也不在我的汇编知识范围内。就目前而言,我只想向左或向右移动我的字符。稍后我会制作适当的 procs 等,但现在这是一个非常奇怪的问题。任何帮助,将不胜感激。 下面是我的汇编代码:

        TITLE Matrix Rain

; Description:Dodge falling numbers to reach the final level
; Authors: John , Killian
; Revision date:2/11/2015

INCLUDE Irvine32.inc
.data
player byte 'X'; Player Character
direction byte ?; Direction the player moves
startY byte 24; Starting Y position
startX byte 39; Starting X position

breakLoop byte 9 ; base case to break

right byte 2; moves player right
left byte 1; moves player left
.code

main PROC
    ;Player Starting Point
    mov dh , startY; column 24
    mov dl,startX ; row 39
    call Gotoxy; places cursor in the middle of the bottom part of the console window
    mov al, player; Copies player character to the AL register to be printed
    call WriteChar; Prints player to screen console
    call Crlf
    ;Player Starting point
    XOR al,al; Zeroes al out
    call ReadKey;Reads keyboard 
    mov eax, 3000
    call delay

    _if1: cmp al , left
         je THEN1
         jmp ENDIF1
         THEN1:

            inc startX
            mov dl, startX
            call Gotoxy
            call Clrscr

            mov al, player
            call WriteChar
            XOR al,al
    ENDIF1:

    _if2: cmp al , right
         je THEN2
         jmp ENDIF2
         THEN2:

            dec startX
            mov dl,startX
            call Gotoxy
            call Clrscr

            mov al, player
            call WriteChar
            XOR al,al
    ENDIF2:
        exit
        main ENDP

        END main

您的代码存在一些问题:

1) 数字不是字符

right byte 2; moves player right
left byte 1; moves player left

rightleft 现在保存纯数字 1 和 2。但是,ReadKey returns 在 ALASCII按下的键的代码。您可以查看键 12 的代码参考,或者您可以编写:

right byte '2'; moves player right
left byte '1'; moves player left

2) 寄存器不适合永久保存值

虽然您初始化了 DH,但是当您到达 call Gotoxy 时它会被改变。在调用 Gotoxy:

之前插入一个 mov dh, startY
inc startX
mov dl, startX
mov dh, startY
call Gotoxy

下一期:

call ReadKey                ; Reads keyboard
mov eax, 3000
call delay

ReadKey returns AL中按下的键的ASCII码,但是mov eax, 3000会破坏这个结果(AL是[的一部分=28=]). RTFM 并将块更改为:

LookForKey:
mov  eax,50          ; sleep, to allow OS to time slice
call Delay           ; (otherwise, some key presses are lost)
call ReadKey         ; look for keyboard input
jz   LookForKey      ; no key pressed yet

3) Clrscr改变当前光标位置

调用 Clrscr 会破坏 Gotoxy 的效果。在 Gotoxy 之后删除对该函数的调用,最好在开发阶段删除所有调用。


我建议立即执行循环:

cmp al, '3'
jne LookForKey

exit

这将在按下“3”时退出程序,否则重复循环。