ah = 8 / int 10h在光标位置返回了错误的字符颜色

时间:2019-05-31 22:27:38

标签: assembly cursor dos masm x86-16

我有汇编语言作业。

为此,我需要制作一个键盘控制的光标(就像在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

This is variable status, this values do not change at all

This is the terminal window.

如您所见,字符及其属性完全错误。

This is the code ran in DosBox

此处光标在传递字符时清除它们。

0 个答案:

没有答案