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