Ассемблер Это просто! Учимся программировать


ГЛАВА 07 - часть 2


В данном случае на метку мы не перейдем, так как команда сравнения (cmp ax,16) не будет верна. Выполнится инструкция mov ah,3 (и, естественно, все, что идет после данной инструкции).

Все просто! Не так ли?

Допустим, нам нужно подождать, пока пользователь нажмет какую-нибудь клавишу. И, если это 'ф' или 'Ф', то перейти на указанную метку. В противном случае, запросить клавишу снова. Обратите внимание, что коды ЗАГЛАВНЫХ и строчных букв различаются! Вот что мы сделаем: Next_key: mov ah,10h int 16h cmp al,'ф' jz F_pressed cmp al,'Ф' jz F_pressed jmp Next_key F_pressed: mov ah,9 mov dx,offset Mess int 21h int 20h Mess db 'Ура! Вы нажали Ф или ф!!!$' ...

Все элементарно!

Стоит отметить еще такой момент: команды jz и je (Jump if Equal - переход, если равно) выполняют одну и ту же функцию. Т.е. можно записать и так: ... int 16h cmp al,'Ф' je F_pressed ...

Команда je переведется ассемблером в jz. Это легко проверить, если после ассемблирования запустить программу под отладчиком.

Разницы между je и jz нет никакой!

Итак, теперь вы умеете производить проверку нажатой клавиши.

Теперь совсем немного терминов.

Команда jmp (которую вы уже знаете "назубок") называется командой безусловного перехода. Т.е. при любом условии компьютер перейдет на указанную метку. Для тех, кто знаком немного с Бейсиком: эта команда эквивалентна GOTO.

goto 20 - переход на строку 20.

Команды вида je и jz - условный переход. Т.е. компьютер перейдет на метку только, если условие выполняется (в нашем случае - если нажата клавиша, которую мы проверяем: cmp al,'Ф'). В Бейсике это выглядит примерно так:

if Key = "Ф" then goto 20

Я все время говорю, что компьютер сделает то-то или то-то. На самом деле, правильнее будет сказать, что процессор сделает то-то. Мы посылаем команды не компьютеру (компьютер - это общее понятие), а напрямую процессору, который и выполняет наши команды.

Теперь рассмотрим таблицу некоторых кодов символов расширенного ASCII.

Что такое расширенный ASCII? Я говорил, что код клавиши возвращается в AX. Но в приведенных выше примерах мы проверяли почему-то клавишу в AL:

cml al,'Y'

Дело в том, что кроме символов (А..Я / A..Z) и цифр (0..1) существуют еще клавиши F1-F12. Мы не можем записать так, проверяя, нажата ли клавиша F1..F12:

cmp al,'F1'

Ассемблер выдаст ошибку, потому что 'F1' - два байта, а регистр AL (как уже общеизвестно) может хранить / проверять только один байт. Для этого используются расширенные коды ASCII. При этом, если мы на запрос нашей программы нажмем F1, то в AL помещается 0, а в AH - расширенный код.

Вот таблица в помощь:

F1..F10 Alt-F1..F10 Shift-F1..F10 Ctrl-F1..F10
3Bh..44h 68h..71h 54h..5Dh 5Eh..67h
<


Начало  Назад  Вперед