что делает следующий ассемблерный код? Мне нужно написать код, который проверяет, была ли нажата кнопка Shift - PullRequest
0 голосов
/ 07 апреля 2019
  PUSH AX
  MOV AH , 12h
  INT 16h
  AND AX,3
  CMP AX,3 ;;; bit 0 = R-shift    bit 1 = L-shift
  JE ClickTwoShift
  POP AX

1 Ответ

1 голос
/ 08 апреля 2019
MOV AH , 12h
INT 16h

Эти инструкции вызывают функцию BIOS.GetKeyboardFlags.Возвращает результат в регистр AX.

AND AX,3

Бит 0 сообщает, нажата ли правая клавиша Shift.
Бит 1 сообщает, нажата ли левая клавиша Shift.
С помощью символа 3, который равен 0000_0000_0000_0011b в двоичной записи, мы сохраняем только эти биты, связанные со сдвигом.

CMP AX,3 ;;; bit 0 = R-shift    bit 1 = L-shift
JE ClickTwoShift

Если в этот момент регистр AX равен3, мы знаем, что и левая, и правая клавиши Shift были нажаты.


Вы можете увидеть, что означают все возвращенные биты, посмотрев на http://stanislavs.org/helppc/int_16-12.html


PUSH AX
MOV AH , 12h
INT 16h
AND AX,3
CMP AX,3 ;;; bit 0 = R-shift    bit 1 = L-shift
JE ClickTwoShift
POP AX

Приведенный выше код может иметь проблему с несбалансированным стеком!
Если мы напишем pop ax перед , условно перейдя к clickTwoShift кодуне потребуется второй pop ax где-нибудь на пути ClickTwoShift .

push    ax
mov     ah, 12h   ; BIOS.GetKeyboardFlags
int     16h       ; -> AX
and     ax, 0003h ; Only keeping 'shift' bits
cmp     ax, 0003h
pop     ax
je      ClickTwoShift
...