2017-02-06 16 views
-4

Я пишу новый код в сборке прямо сейчас, и мне нужна ваша помощь! Я использовал 16-кратное прерывание, и я хочу проверить, доступно ли нажатие клавиши или нет, поэтому я хочу проверить, хотите ли теперь нулевой флаг. - как мне это сделать?Assembly- Как проверить, является ли ZF 0 или 1?

Спасибо! :)

+4

Я полагаю, x86-16, верно? 'jz' или' je' (в зависимости от вашего стиля) проверит, будет ли ZF = 1. 'jnz' /' jne' проверит ZF = 0. См. [Наш документ] (https://stackoverflow.com/documentation/x86/5808/control-flow/20470/conditional-jumps#t=201702060901496425342). –

+2

Как минимум, получите копию руководства по набору инструкций Intel x86 и/или x86_64. –

+0

Также, если вы не хотите входить в ветви, но значение 0/1 может быть полезно для вас в следующем коде, вы можете использовать 'setz/setnz' для установки значения 8b в 0/1 в соответствии с ZF (вместо' jz/jnz'). Поскольку вам действительно нужно протестировать ZF после 'int 16h, ah = 1', этот ответ НЕ имеет значения, но может быть следующее, что нужно узнать (как определить, является ли значение равным нулю): http://stackoverflow.com/a/41175294/4271923 – Ped7g

ответ

1

Как вы можете видеть here, ZF=1, когда нет нажатия клавиши, и ZF=0, когда имеется нажатие клавиши. Вы можете использовать J(N)Z инструкции расшириться соответственно

Использование JZ:

mov ax, 0100h 
    int 16h 
    jz no_key 
    ; Handle case if there is a key press here 
    ; AH will contain the scan code; AL will contain the ASCII code 

no_key: 
    ; Handle case if there is no key press here 

Использование JNZ:

mov ax, 0100h 
    int 16h 
    jnz key_pressed 
    ; Handle case if there is no key press here 

key_pressed: 
    ; Handle case if there is a key pressed here 
    ; AH contains the scan code; AL contains the ASCII code 
+0

Ничего себе, спасибо! Это было очень полезно для меня! :) –

Смежные вопросы