我有汇编语言作业。
为此,我需要制作一个键盘控制的光标(就像在irvine的MASM中一样)。我还需要在DosBox上以图形模式(ah = 12h int 10h VGA模式)运行此代码。我的程序是.COM可执行文件。
到目前为止,我进行了2个过程来获取角色的当前位置,角色和属性。
get_cursor proc
mov bh,0
mov ah,8
int 10h
mov acursor,ah
mov ccursor,al
ret
get_cursor endp
get_pos proc
mov ah,3
mov bh,0
int 10h
mov y,dh
mov x,dl
ret
get_pos endp
我还写了两个宏将字符设置在所需的位置。
set_cursor MACRO acursor,ccursor
mov ah,9
mov al,ccursor
mov bl,acursor
mov cx,1
int 10h
ENDM
set_pos MACRO x,y
mov bh,0
mov dl,x
mov dh,y
mov ah,2
int 10h
ENDM
但是问题是,每当我尝试获取当前字符属性时,它都是错误的。例如:
字符:蓝色背景为空字符。
get_cursor:AL = 00h为空,而AH = 7d为浅灰色。
这就是我使用这些过程和宏的方式。我真的认为这就是问题所在,因为它看起来确实令人困惑。但是,在检查了我之前说的值之后,我用光了所有选项。
call get_cursor
call get_pos
set_pos x,y
set_cursor 1fh , 0dbh
edit:
mov ah,0 ;wait for a key press
int 16h
;48 up , 50 down , 4b left , 4d right
cmp ah,48h ;up direction key is pressed
je cursor_up
cmp ah,50h ;down direction key is pressed
je cursor_down
cmp ah,4bh ;up direction key is pressed
je cursor_left
cmp ah,4dh ;down direction key is pressed
je cursor_right
cmp ah,1 ;ESC to exit
je exit
jmp edit
cursor_up:
set_pos x,y
set_cursor acursor,ccursor
call get_pos
dec y
set_pos x,y
call get_cursor
call get_pos
set_cursor 1fh,0dbh
jmp edit
cursor_down:
set_pos x,y
set_cursor acursor,ccursor
call get_pos
inc y
set_pos x,y
call get_cursor
call get_pos
set_cursor 1fh,0dbh
jmp edit
cursor_left:
set_pos x,y
set_cursor acursor,ccursor
call get_pos
dec x
set_pos x,y
call get_cursor
call get_pos
set_cursor 1fh,0dbh
jmp edit
cursor_right:
set_pos x,y
set_cursor acursor,ccursor
call get_pos
inc x
set_pos x,y
call get_cursor
call get_pos
set_cursor 1fh,0dbh
jmp edit
如您所见,字符及其属性完全错误。
此处光标在传递字符时清除它们。