Polesse
#04
16 апреля 1999 |
|
Ассемблер - Флаги, операции сравнения и переноса.
┌──────────────────────────────────────────────────────────────┐ │ ████▓▓▓▓▒▒▒▒░░░░ АССЕМБЛЕР ДЛЯ НАЧИНАЮЩИХ ░░░░▒▒▒▒▓▓▓▓█████ │ └──────────────────────────────────────────────────────────────┘ (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 ; На сегодня, я думаю достаточно. Если появятся какие-либо во- росы, пишите, звоните, в общем найдите способ связаться, я все объясню. До новых встреч.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября