┌──────────────────────────────────────────────────────────────┐
│ ████▓▓▓▓▒▒▒▒░░░░ АССЕМБЛЕР ДЛЯ НАЧИНАЮЩИХ ░░░░▒▒▒▒▓▓▓▓█████ │
└──────────────────────────────────────────────────────────────┘
(C) THINKER
───────────
Здравствуйте уважаемые читатели! Мы продолжаем эту рубрику
для тех, кто хочет научится программировать на ассемблере.
Сегодня мы поговорим о флагах, операциях сравнения и перено-
са. Но сейчас Вам необходимо понять такую вещь, как метки. Метки
- это те же самые адреса, но записанные в мнемоническом виде.
Если вы знаете язык Паскаль, то поймете о чем я говорю. Для тех,
кто еще не понял: представьте программу на Бейсике, но вместо
номеров строк-слова:
BEGIN PRINT "*"
CONT GOTO BEGIN
BEGIN и CONT - это метки. Остается дополнить, что метки соз-
даны только для удобства и являются теми же самыми адресами. Те-
перь можно продолжать.
Для начала уясним для себя: флаг-это бит, который может при-
нимать значения "1" или "0". В Бейсике, например, есть системные
переменные, которые содержат именно флаги. В ассемблере для этой
цели служит флаговый регистр "F" (регистровая пара "AF"). В него
невозможно записать какое-либо значение с помощью мнемоники "LD"
(помните что это такое?). Значение "F" можно изменять только
косвенно.
Так мы постепенно перешли к операции сравнения - CP. Эта мне-
моника сравнивает только регистр "A" (аккумулятор) с другим ре-
гистром или с другим значением.
CP B ; сравниваем регистр "A" с регистром "B"
CP 10 ; сравниваем регистр "A" с числом "10"
Один из флагов в регистре "F" - это флаг под названием "Z".
Он устанавливается если "A" будет равен значению или регистру с
которым мы его сравниваем. Однако нам нужно использовать значе-
ние "F", иначе "CP" не будет иметь смысла применять.
Теперь нужно рассказать о безусловном переходе. За этот пере-
ход отвечает команда процессора "JP", которую можно сравнить с
оператором Бейсика GOTO (GO TO).
JP 15616 ; переход на адрес 15616
JP LABEL ; переход на метку LABEL
Из безусловного перехода очень легко можно сделать условный.
Мы можем переходить на адреса по условию: установлен флаг или
нет. Например:
LD A,5 ; заносим в аккумулятор число "5"
CP 5 ; сравниваем "A" с числом "5". Устанавлива-
; ется флаг "Z" т.к "A" равно 5
JP Z,15616 ; переходим на адрес 15616, если флаг "Z"
; установлен
RET ; возвращаемся
Существует еще несколько условий, которые могут использовать-
ся при условном переходе:
A=S ---> Z
A<>S ---> NZ
A<-S ---> C
A>=S ---> NC
Например, нам нужно перейти на адрес ADR, если "A" не равно
"10".
CP 10 ; сравниваем регистр "A" с числом "10". В зави-
симости от результата сравнения устанавливает-
ся или сбрасывается флаг "Z". Если A<>10
(A<>S), то флаг "Z" сбрасывается.
JR NZ, ADR ; переходим на ADR, если флаг "Z" сброшен.
RET ; возвращаемся.
Теперь, давайте напишем программку посложнее. Задание: ждать
нажатия любой клавиши, если будет нажата клавиша "1", то напеча-
тать символ "1", если будет нажата любая другая клавиша, то вы-
вести символ "0". Скажу, что код последней нажатой клавиши со-
держится по адресу 23560.
Постарайтесь сами написать решение, если у Вас ничего не по-
лучается, вот ответ:
;ПОДГОТАВЛИВАЕМ ЭКРАН К РАБОТЕ ---------------------------------
CALL 3435 ; очистка экрана
LD A,2 ; установка потока
CALL 5633 ; для печати
LD A,0 ; обнуляем системную переменную
LD (23560),A ; содержащую код последней нажатой клавиши
;ЖДЕМ НАЖАТИЯ КЛАВИШИ ------------------------------------------
WAIT LD A,(23560) ; заносим в "A" код последн. нажат. клавиши
CP 0 ; если 0, то
JR Z WAIT ; идти на метку "WAIT" - начало блока
;СРАВНЕНИЕ. В РЕГИСТРЕ "A" - КОД КЛАВИШИ -----------------------
CP "1" ; сравниваем "A" с кодом калвиши "1"
JR Z, PR_1 ; если "=" , то переходим на метку PR_1,
; иначе - продолжаем
;ВЫВОД "0" -----------------------------------------------------
LD A,"0" ; заносим в аккумулятор число "0"
RST 16 ; вызываем процедуру печати аккумулятора
RET ; возвращаемся
;ВЫВОД "1" -----------------------------------------------------
PR_1 LD A,"1" ; действия аналогичны вышеприведенным
RST 16 ;
RET ;
На сегодня, я думаю достаточно. Если появятся какие-либо во-
росы, пишите, звоните, в общем найдите способ связаться, я все
объясню.
До новых встреч.