在程序集中向左或向右移动字符
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
right
和 left
现在保存纯数字 1 和 2。但是,ReadKey
returns 在 AL
中 ASCII按下的键的代码。您可以查看键 1 和 2 的代码参考,或者您可以编写:
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”时退出程序,否则重复循环。
我在组装一个简单的游戏,目前我只是想根据数字 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
right
和 left
现在保存纯数字 1 和 2。但是,ReadKey
returns 在 AL
中 ASCII按下的键的代码。您可以查看键 1 和 2 的代码参考,或者您可以编写:
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”时退出程序,否则重复循环。