8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 15 16 17 18 19 20 21 ... 39

только после этого с помощью оператора «ИЛИ» выполнить опера-цию между числами, находящимися в регистрах А и L.

Оператор «Исключающее ИЛИ» (XOR) каждому разряду регистра А присваивает значение «О», если данный разряд равен одноименному разряду операнда S, и значение «1», если цифры в одноименных разрядах различны. Команда «XOR А» применяется, например, когда требуется обнулить содержимое регистра А.

Команды инверсии (CPL) и изменения знака (NEG)

Как было отмечено в разделе 3.1, для получения дополнительного кода числа следует поразрядно инвертировать значения составляющих его цифр и к полученному таким образом числу прибавить 1. Инверсия всех разрядов числа производится с помощью оператора CPL. А заканчивается операция преобразования этого числа в дополнительный код путем изменения знака с помощью оператора NEG. Обе операции выполняются над содержимым регистра А Результат также помещается в регистр А. Запись этих команд на языке ассемблера содержит только мнемонические символы операторов CPL и NEG (без операндов).

Пусть в регистре А содержится число 00110101 = 35Н. В результате выполнения операторов «CPL» или «NEG» в регистре А останется соответственно число 11001010 = 0CAH или 11001011 = 0CBH. В Табл. 6.8 приведены примеры записи команд логических операций.

Таблица 6.8. Примеры команд логических операций

Команда языка ассемблера

Машинный

код команды

Описание операции

Требуемое число

импульсов тактовой частоты

AND 02Н

Е6 02

Логическое умножение содержимого регистра А на константу 02Н (маска разряда)

7

OR02H

F6 02

Логическое сложение содержимого регистра А и константы 02Н (установка разряда)

7

OR(HL)

В6

Логическое сложение содержимого регистра А и содержимого ячейки памяти по адресу, указанному в сдвоенном регистре H-L

7

XOR А

AF

Обнуляется содержимое регистра А

4

CPL

2F

Инверсия каждого из разрядов регистра А

4

NEG

ED44

Изменение знака содержимого аккумулятора А

8 .

gКак нам уже известно, команды, из которых

КОМАНДЫ состоит программа, считываются ЦПУ из памяти ПЕРЕХОДА начиная с адреса ООООН и последовательно выполняются. Следовательно, порядок выполнения команд определяется последовательностью их расположения в памяти процессора. Однако часто, в зависимости от конкретного содержания задачи, которую выполняет программа, требуется изменить последовательность выполнения операций. В этом случае программа имеет разветвленную структуру, и ход ее выполнения зависит от различных условий. Изменить последовательность выполнения команд можно с помощью команд перехода.

Команды безусловного перехода (JP, JR)

Команды безусловного перехода осуществляют переход по указанному адресу без проверки каких-либо условий. В зависимости от способа указания адреса перехода различают два типа операторов - JP (Jump) и JR (Jump Relative). В Табл. 6.9 приведено описание действий, выполняемых командами с этими операторами.

Таблица 6.9. Команды безусловного перехода (операторы JP и JR)

Команда языка ассемблера

Машинный код команды

Описание операции

требуемое число

импульсов тактовой частоты

5? 1т

d ml

(3-байтовая

команда)

Переход по адресу 1т (указание прямого адреса). 1т - 2-байтовое число, представляющее адрес перехода

10

18 я

(2-байтовая команда)

Переход на п адресов вперед или назад (указание относительного адреса). п - 1-байтовая константа со знаком

12

Счетчик команд (PC) внутри ЦПУ всегда указывает адрес следующей команды, которую процессор должен считать из памяти. Действие команды перехода сводится к следующему: текущее значение адреса команды в счетчике команд заменяется значением адреса, указанного командой перехода. То есть при выполнении команды с оператором JP осуществляется замена «РС <- 1т», а при выполнении команды с оператором JR - замена «РС <- РС+я».


Предположим, например, что команда перехода записана в ячейке с адресом 0200Н. Давайте подумаем, как осуществить переход по адресу 0250Н. Если использовать оператор JP с указанием абсолютного адреса, то получим следующую запись: JP 0250Н (машинный код команды - СЗ 50 02).

Ту же самую операцию можно осуществить с помощью команды с оператором JR, в которой указывается относительный адрес перехода:

JR 4ЕН (машинный код команды - 18 4Е).

Внимательный читатель мог заметить, что шестнадцатеричное число 4Е (в десятичной системе - 80), указанное в качестве константы оператора JR, не равно разности адресов 0250Н и 0200Н (десятичное число 78). На самом деле ошибки здесь нет. Действительно: оператор JR соответствует 2-байтовой команде «18 4Е» (Рис. 6.5), поэтому занимает две ячейки памяти с адресами 0200Н и 0201Н. Таким образом, к моменту, когда ЦПУ полностью считает эту машинную команду, в счетчике команд будет установлен адрес 0202Н. То есть значение константы указано верно (250Н - 202Н = 4ЕН).

Команда «JR п» меняет содержимое PC следующим образом: РС«-РС+я

(Так определяется параметрп) Адрес перехода .........0250Н

Адрес команды, \ ...Q202H следующей за «JR п»

4ЁН

Область памяти Адрес Содержимое ячейки ячейки 0000Н

0200 ,020 1 0202

.Переход 0 250

18

\ Команда «JR 4ЕН

1У-

При считывании 4Есодержание PC равно 0202Н

Рис. 6.5. Команда JR с указанием относительного адреса

Число и, указывающее дистанцию до адреса перехода, является константой со знаком, значение которой ограничено диапазоном от - 128 до 127 в десятичной системе счисления.

Команды условного перехода

Довольно часто возникает необходимость изменить последовательность выполнения команд программы в зависимости от выполнения или невыполнения некоторого условия. При этом используются операторы условного перехода. Проверка выполнения условия осуществляется по состоянию регистра флагов ЦПУ. В Табл. 6.10 приведены наиболее часто применяемые команды условного перехода.

Таблица 6.10. Команды условного перехода

Команда JP с указанием абсолютного адреса

Команда JR с указанием относительного адреса

Действие

JP Z, 1т

JRZ, л

Проверяется значение флага Z; если оно равно 0, осуществляется переход

JPNZ,/m

JRNZ,«

Проверяется значение флага Z; если оно не равно 0, осуществляется переход

JP С, 1т

JRC,«

Проверяется значение флага С; если был перенос разряда, осуществляется переход

JP NC, Im

JRNC.w

Проверяется значение флага С; если

не было переноса разряда, осуществляется

переход

Помимо перечисленных условий, в командах типа JP могут также использоваться переходы по знаку содержимого регистра А. При этом проверяется значение флага S регистра признаков. Как видно из таблицы, в командах условного перехода JP может указываться Как абсолютный, так и относительный адрес. Следует упомянуть еще °б одном, весьма полезном в некоторых случаях, операторе условного перехода - DJNZ (Decrement Jump Non-Zero). Запись команды с этим оператором имеет следующий вид: «DJNZ я». При выполнении этой команды из содержимого регистра В вычитается 1. Если результат окажется отличным от 0, то выполняется переход по указанному эдресу. Поместив в регистр В требуемое число повторений некото-Рой последовательности операций (не более 256 повторений), с помощью одного лишь оператора DJNZ можно задать момент остановки этого процесса (Рис. 6.6).


Программа на языке ассемблера]

Метка

Мнемокод LD

LOOP:

Л

На языке ассемблера адрес можно представить в виде символов

Операнд В,ОАН

Пример записи

DJNZ

LOOP-

В регистр В загружено число 10

Повторяется 10 раз

Выполняем вычитание В - 1,еслиВ*0, переходим на метку LOOP

При трансляции символический адрес переводится в соответствующий двоичный код

Рис. 6.6. Пример применения команды DJNZ

В данном примере символьная константа LOOP, записанная в качестве константы команды DJNZ, означает адрес команды, обозначенной меткой LOOP. В этом случае каждый раз после выполнения последовательности команд программы, начиная от команды с меткой LOOP до команды DJNZ, из содержимого регистра В вычитается 1. Этот цикл повторяющихся операций продолжается до тех пор, пока значение числа, содержащегося в регистре В, не станет равным 0. Поскольку в данном примере в регистр В посредством команды LD загружено число ОАН (равно десятичному числу Ю), последовательность команд, записанных между командой с меткой LOOP и командой DJNZ, будет произведена 10 раз.

Прием с использованием метки довольно часто используется при программировании на языке ассемблера. Не огорчайтесь, если

из предыдущего примера вам не совсем ясен его смысл. У вас еще будет возможность основательно разобраться в этом, поскольку мы еше не раз обратимся к этому приему в конкретных программах.

6.6.

КОМАНДЫ ВЫЗОВА

ПОДПРОГРАММЫ

И ВОЗВРАТА

ИЗ ПОДПРОГРАММЫ

(CALL, RET)

Знакомо ли читателю слово «подпрограмма»? Тот, кому доводилось программировать на языках типа Фортран, Кобол, Паскаль и др., хорошо себе представляет, о чем идет речь.

Внутри программы, представляющей собой последовательность команд, часто встречаются отдельные фрагменты, выполняющие некоторые самостоятельные задачи. В подобных случаях эти фрагменты оформляются в виде отдельных программ, которые в нужном месте основной программы вызываются с помощью специального оператора.

Такая программа, выполняющая самостоятельную задачу и оформленная соответствующим образом, называется подпрограммой. Вызов подпрограммы из основной (главной) программы осуществляет команда CALL (вызвать). Обратный переход из подпрограммы в главную программу происходит с помощью команды RET (Return - вернуться).

Допустим, в программе управления некоторым механическим устройством предусмотрен многократный запуск электродвигателя. В целях сокращения записи мы оформляем ту часть программы, которая управляет запуском электродвигателя в виде подпрограммы (назовем ее «MOTOR»). Подпрограмма помещается в Память после метки MOTOR. Теперь каждый раз после выполнения команды «CALL MOTOR» происходит переход к подпрограмме (Рис. 6.7).

Подпрограмма запускает электродвигатель в нужное время, а Затем по команде RET, записанной в конце подпрограммы, снова ПеРедает управление процессом в главную программу. Выполнение главной программы продолжается начиная с команды, запи-СаНной после оператора CALL. В данном случае слово «MOTOR»



0 ... 15 16 17 18 19 20 21 ... 39