Раздел: Документация
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. Примеры команд логических операций
gКак нам уже известно, команды, из которых КОМАНДЫ состоит программа, считываются ЦПУ из памяти ПЕРЕХОДА начиная с адреса ООООН и последовательно выполняются. Следовательно, порядок выполнения команд определяется последовательностью их расположения в памяти процессора. Однако часто, в зависимости от конкретного содержания задачи, которую выполняет программа, требуется изменить последовательность выполнения операций. В этом случае программа имеет разветвленную структуру, и ход ее выполнения зависит от различных условий. Изменить последовательность выполнения команд можно с помощью команд перехода. Команды безусловного перехода (JP, JR) Команды безусловного перехода осуществляют переход по указанному адресу без проверки каких-либо условий. В зависимости от способа указания адреса перехода различают два типа операторов - JP (Jump) и JR (Jump Relative). В Табл. 6.9 приведено описание действий, выполняемых командами с этими операторами. Таблица 6.9. Команды безусловного перехода (операторы JP и JR)
Счетчик команд (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 4Е \ Команда «JR 4ЕН 1У- При считывании 4Есодержание PC равно 0202Н Рис. 6.5. Команда JR с указанием относительного адреса Число и, указывающее дистанцию до адреса перехода, является константой со знаком, значение которой ограничено диапазоном от - 128 до 127 в десятичной системе счисления. Команды условного перехода Довольно часто возникает необходимость изменить последовательность выполнения команд программы в зависимости от выполнения или невыполнения некоторого условия. При этом используются операторы условного перехода. Проверка выполнения условия осуществляется по состоянию регистра флагов ЦПУ. В Табл. 6.10 приведены наиболее часто применяемые команды условного перехода. Таблица 6.10. Команды условного перехода
Помимо перечисленных условий, в командах типа 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
|