Polesse #04
16 апреля 1999

Ассемблер - Флаги, операции сравнения и переноса.

<b>Ассемблер</b> - Флаги, операции сравнения и переноса.
┌──────────────────────────────────────────────────────────────┐
│ ████▓▓▓▓▒▒▒▒░░░░ АССЕМБЛЕР ДЛЯ НАЧИНАЮЩИХ  ░░░░▒▒▒▒▓▓▓▓█████ │
└──────────────────────────────────────────────────────────────┘

(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           ;

   На сегодня, я думаю достаточно.  Если появятся какие-либо во-
росы,  пишите, звоните,  в общем найдите способ связаться, я все
объясню.
   До новых встреч.




Другие статьи номера:

Ассемблер - Флаги, операции сравнения и переноса.

В паутине - График работы городских серверов.

Мы выбираем - Все, что вы хотели узнать о гибких магнитных дисках,но боялись спросить.

Навезли новья - Обзор новинок ПО: Chainick: Horror in Flat.

Рек-тайм - Реклама и объявления ...

Слабо пройти - Тем, кто застрял в Chif.

Слово авторов - Нет пророка, в своем отечестве...


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Обзорчик - Обзор игровых программ: Hard Drivin, Battle Ships, Three Week In Paradise, Microprosse Soccer.
Программирование - процедура индикаторов каналов на "AY" (эквалайзер).
Вступление - наша доблестная почта веpнула обpатно мой пеpевод в Уссуpийск.
Смайлик - несколько стаpых номеpов КОМПЬЮТЕP ПPЕСС.
Анкетирование - Результаты анкетирования о состоянии платформы ZX-Spectrum в странах бывшего СССР.

В этот день...   21 ноября