8086 ассемблер, INT 16,2 - PullRequest
       10

8086 ассемблер, INT 16,2

4 голосов
/ 11 ноября 2009

Я застрял в этой вещи, я хочу посмотреть, была ли нажата правая кнопка переключения, поэтому у меня есть код ассамблера:

mov ah,2
int 16h           ;calling INT 16,2 - Read Keyboard Flags interrupt      
mov ah,10000000b
shl al,7 
and al,10000000b
cmp al,ah         ;check if first bit is 1
je rshift 
jmp final


rshift:
mov ah,9
lea dx,rsh  ;rsh is a string that says that "right shift button has been pressed"
int 21h
jmp final  

final:             ; quit program
mov ax,4c00h
int 21h

почему он не работает? Я думаю, проблема в том, что int 16,2 не работает должным образом, если так, то почему? вот что должен делать INT 16,2:

AH = 02
on return:
AL = BIOS keyboard flags (located in BIOS Data Area 40:17)

|7|6|5|4|3|2|1|0|  AL or BIOS Data Area 40:17
| | | | | | | `---- right shift key depressed
| | | | | | `----- left shift key depressed
| | | | | `------ CTRL key depressed
| | | | `------- ALT key depressed
| | | `-------- scroll-lock is active
| | `--------- num-lock is active
| `---------- caps-lock is active
`----------- insert is active

Я никогда не вижу сообщения, я смотрел регистр AL в отладке, и он, кажется, не меняется после вызова INT 16,2. работа с тасм

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

Как вы это тестируете?

Из любопытства я сделал простую программу (код ниже). При запуске под консолью Windows он обнаруживает сдвиг влево (Result: 2), но никогда не обнаруживает сдвиг вправо (ожидается Result: 1, но только получил Result: 0).

При запуске в режиме чистого DOS (в VMWare) корректно отображаются все комбинации (от 0 до 3).

Так что, похоже, это артефакт NTVDM (эмуляция Windows DOS), хотя у меня нет источников для цитирования.

Мой код:

.model small

.code

start:
    mov ax, seg msg
    mov ds, ax

    mov ah, 2
    int 16h

    and al,3        ; get two lower bits - both SHIFTs
    add digit, al   ; convert to decimal

    lea dx, msg
    mov ah, 9
    int 21h

    mov ax, 4c00h
    int 21h

.data

msg     db  'Result: '
digit   db  '0'
        db  13,10,'$',0

.stack
        db  16384 dup(?)

end start
1 голос
/ 11 ноября 2009

вы сможете очистить свой чек, выполнив:

test al,1
jnz rshift
0 голосов
/ 11 ноября 2009

Я не могу объяснить, почему ваш код не работает, но вы можете заменить

mov ah,10000000b
shl al,7 
and al,10000000b
cmp al,ah         ;check if first bit is 1

от

test al, 1

, который делает то же самое и более идиоматично, если в сборке есть такая вещь, как идиома.

EDIT: Как указывает Майкл в комментарии ниже, вам нужно отменить условный переход, если вы используете инструкцию test. test al, C устанавливает ZF, если и только поразрядно, а al AND C равно нулю.

...