Безусловные переходы. Основы программирования МП устройств (Лекция) Команды передачи управления

  • 10.01.2024

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

Формальная логика работает на уровне утверждений истинно и ложно. Для микропроцессора это, как правило, означает 1 и 0 соответственно. Для компьютера язык нулей и единиц является родным, но минимальной единицей данных, с которой работают машинные команды, является байт. Однако на системном уровне часто необходимо иметь возможность работать на предельно низком уровне – на уровне бит.

Рис. 29. Средства логической обработки данных


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

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

Логические данные

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

Исчисление высказываний представляет собой совокупность правил, используемых для определения истинности или ложности некоторой комбинации высказываний.

Исчисление высказываний очень гармонично сочетается с принципами работы компьютера и основными методами его программирования. Все аппаратные компоненты компьютера построены на логических микросхемах. Система представления информации в компьютере на самом нижнем уровне основана на понятии бита. Бит, имея всего два состояния (0 (ложно) и 1 (истинно)), естественным образом вписывается в исчисление высказываний.

Согласно теории, над высказываниями (над битами) могут выполняться следующие логические операции.


1. Отрицание (логическое НЕ) – логическая операция над одним операндом, результатом которой является величина, обратная значению исходного операнда.

Эта операция однозначно характеризуется следующей таблицей истинности (табл. 12).

Таблица 12. Таблица истинности для логического отрицания

2. Логическое сложение (логическое включающее ИЛИ) – логическая операция над двумя операндами, результатом которой является «истина» (1), если один или оба операнда имеют значение «истина» (1), и «ложь» (0), если оба операнда имеют значение «ложь» (0).

Эта операция описывается с помощью следующей таблицы истинности (табл. 13).

Таблица 13. Таблица истинности для логического включающего ИЛИ

3. Логическое умножение (логическое И) – логическая операция над двумя операндами, результатом которой является «истина» (1) только в том случае, если оба операнда имеют значение «истина» (1). Во всех остальных случаях значение операции «ложь» (0).

Эта операция описывается с помощью следующей таблицы истинности (табл. 14).

Таблица 14. Таблица истинности для логического И

4. Логическое исключающее сложение (логическое исключающее ИЛИ) – логическая операция над двумя операндами, результатом которой является «истина» (1), если только один из двух операндов имеет значение «истина» (1), и ложь (0), если оба операнда имеют значение «ложь» (0) или «истина» (1). Эта операция описывается с помощью следующей таблицы истинности (таб. 15).

Таблица 15. Таблица истинности для логического исключающего ИЛИ

Система команд микропроцессора содержит пять команд, поддерживающих данные операции. Эти команды выполняют логические операции над битами операндов. Размерность операндов, естественно, должна быть одинакова. Например, если размерность операндов равна слову (16 бит), то логическая операция выполняется сначала над нулевыми битами операндов, и ее результат записывается на место бита 0 результата. Далее команда последовательно повторяет эти действия над всеми битами с первого до пятнадцатого.

Логические команды

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

1) and операнд_1, операнд_2 – операция логического умножения. Команда выполняет поразрядно логическую операцию И (конъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1;

2) ог операнд_1, операнд_2 – операция логического сложения. Команда выполняет поразрядно логическую операцию ИЛИ (дизъюнкцию) над битами операндов операнд_1 и операнд_2. Результат записывается на место операнд_1;

3) хог операнд_1, операнд_2 – операция логического исключающего сложения. Команда выполняет поразрядно логическую операцию исключающего ИЛИ над битами операндов операнд_1 и операнд_2. Результат записывается на место операнде;

4) test операнд_1, операнд_2 – операция «проверить» (способом логического умножения). Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния;

5) not операнд – операция логического отрицания. Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.

Для представления роли логических команд в системе команд микропроцессора очень важно понять области их применения и типовые приемы их использования при программировании.

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

Для организации подобной работы с битами операнд_2 обычно играет роль маски. С помощью установленных в 1 бите этой маски и определяются нужные для конкретной операции биты операнд_1. Покажем, какие логические команды могут применяться для этой цели:

1) для установки определенных разрядов (бит) в 1 применяется команда ог операнд_1, операнд_2.

В этой команде операнд_2, выполняющий роль маски, должен содержать единичные биты на месте тех разрядов, которые должны быть установлены в 1 в операнд_1;

2) для сброса определенных разрядов (бит) в 0 применяется команда and операнд_1, операнд_2.

В этой команде операнд_2, выполняющий роль маски, должен содержать нулевые биты на месте тех разрядов, которые должны быть установлены в 0 в операнд_1;

3) команда хог операнд_1, операнд_2 применяется:

а) для выяснения того, какие биты в операнд_1 и операнде различаются;

б) для инвертирования состояния заданных бит в операнд_1.

Интересующие нас биты маски (операнд_2) при выполнении команды хог должны быть единичными, остальные – нулевыми;

Для проверки состояния заданных бит применяется команда test операнд_1, операнд_2 (проверить операнд_1).

Проверяемые биты операнд_1 в маске (операнд_2) должны иметь единичное значение. Алгоритм работы команды test подобен алгоритму команды and, но он не меняет значения операнд_1. Результатом команды является установка значения флага нуля zf:

1) если zf = 0, то в результате логического умножения получился нулевой результат, т. е. один единичный бит маски, который не совпал с соответствующим единичным битом операнде;

2) если zf = 1, то в результате логического умножения получился ненулевой результат, т. е. хотя бы один единичный бит маски совпал с соответствующим единичным битом операнд_1.

Для реакции на результат команды test целесообразно использовать команду перехода jnz метка (Jump if Not Zero) – переход, если флаг нуля zf ненулевой, или команду с обратным действием – jz метка (Jump if Zero) – переход, если флаг нуля zf = 0.

Следующие две команды позволяют осуществить поиск первого установленного в 1 бита операнда. Поиск можно произвести как с начала, так и от конца операнда:

1) bsf операнд_1, операнд_2 (Bit Scaning Forward) – сканирование битов вперед. Команда просматривает (сканирует) биты операнд_2 от младшего к старшему (от бита 0 до старшего бита) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в операнд_1 заносится номер этого бита в виде целочисленного значения. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0;

2) bsr операнд_1, операнд_2 (Bit Scaning Reset) – сканирование битов в обратном порядке. Команда просматривает (сканирует) биты операнд_2 от старшего к младшему (от старшего бита к биту 0) в поисках первого бита, установленного в 1. Если таковой обнаруживается, в операнд_1 заносится номер этого бита в виде целочисленного значения. При этом важно, что позиция первого единичного бита слева отсчитывается все равно относительно бита 0. Если все биты операнд_2 равны 0, то флаг нуля zf устанавливается в 1, в противном случае флаг zf сбрасывается в 0.

В последних моделях микропроцессоров Intel в группе логических команд появилось еще несколько команд, которые позволяют осуществить доступ к одному конкретному биту операнда. Операнд может находиться как в памяти, так и в регистре общего назначения. Положение бита задается смещением бита относительно младшего бита операнда. Значение смещения может задаваться как в виде непосредственного значения, так и содержаться в регистре общего назначения. В качестве значения смещения вы можете использовать результаты работы команд bsr и bsf. Все команды присваивают значение выбранного бита флагу СЕ

1) bt операнд, смещение_бита (Bit Test) – проверка бита. Команда переносит значение бита в флаг cf;

2) bts операнд, смещение_бита (Bit Test and Set) – проверка и установка бита. Команда переносит значение бита в флаг CF и затем устанавливает проверяемый бит в 1;

3) btr операвд, смещение_бита (Bit Test and Reset) – проверка и сброс бита. Команда переносит значение бита в флаг CF и затем устанавливает этот бит в 0;

4) btc операнд, смещение_бита (Bit Test and Convert) – проверка и инвертирование бита. Команда переносит значение бита в флаг cf и затем инвертирует значение этого бита.

Команды сдвига

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

Все команды сдвига перемещают биты в поле операнда влево или вправо в зависимости от кода операции. Все команды сдвига имеют одинаковую структуру – коп операнд, счетчик_сдвигов.

Количество сдвигаемых разрядов – счетчик_сдвигов – располагается на месте второго операнда и может задаваться двумя способами:

1) статически, что предполагает задание фиксированного значения с помощью непосредственного операнда;

2) динамически, что означает занесение значения счетчика сдвигов в регистр cl перед выполнением команды сдвига.

Исходя из размерности регистра cl понятно, что значение счетчика сдвигов может лежать в диапазоне от 0 до 255. Но на самом деле это не совсем так. В целях оптимизации микропроцессор воспринимает только значение пяти младших битов счетчика, т. е. значение лежит в диапазоне от 0 до 31.

Все команды сдвига устанавливают флаг переноса cf.

По мере сдвига битов за пределы операнда они сначала попадают на флаг переноса, устанавливая его равным значению очередного бита, оказавшегося за пределами операнда. Куда этот бит попадет дальше, зависит от типа команды сдвига и алгоритма программы.

По принципу действия команды сдвига можно разделить на два типа:

1) команды линейного сдвига;

2) команды циклического сдвига.

Команды линейного сдвига

К командам этого типа относятся команды, осуществляющие сдвиг по следующему алгоритму:

1) очередной «выдвигаемый» бит устанавливает флаг CF;

2) бит, вводимый в операнд с другого конца, имеет значение 0;

3) при сдвиге очередного бита он переходит во флаг CF, при этом значение предыдущего сдвинутого бита теряется! Команды линейного сдвига делятся на два подтипа:

1) команды логического линейного сдвига;

2) команды арифметического линейного сдвига.

К командам логического линейного сдвига относятся следующие:

1) shl операнд, счетчик_сдвигов (Shift Logical Left) – логический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули;

2) shr операнд, счетчик_сдвигов (Shift Logical Right) – логический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева (в позицию старшего, знакового бита) вписываются нули.

На рисунке 30 показан принцип работы этих команд.

Рис. 30. Схема работы команд линейного логического сдвига


Команды арифметического линейного сдвига отличаются от команд логического сдвига тем, что они особым образом работаются со знаковым разрядом операнда.

1) sal операнд, счетчик_сдвигов (Shift Arithmetic Left) – арифметический сдвиг влево. Содержимое операнда сдвигается влево на количество битов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита) вписываются нули. Команда sal не сохраняет знака, но устанавливает флаг с/в случае смены знака очередным выдвигаемым битом. В остальном команда sal полностью аналогична команде shl;

2) sar операнд, счетчик_сдвигов (Shift Arithmetic Right) – арифметический сдвиг вправо. Содержимое операнда сдвигается вправо на количество битов, определяемое значением счетчик_сдвигов. Слева в операнд вписываются нули. Команда sar сохраняет знак, восстанавливая его после сдвига каждого очередного бита.

На рисунке 31 показан принцип работы команд линейного арифметического сдвига.


Рис. 31. Схема работы команд линейного арифметического сдвига

Команды циклического сдвига

К командам циклического сдвига относятся команды, сохраняющие значения сдвигаемых бит. Есть два типа команд циклического сдвига:

1) команды простого циклического сдвига;

2) команды циклического сдвига через флаг переноса cf.

К командам простого циклического сдвига относятся:

1) rol операнд, счетчик_сдвигов (Rotate Left) – циклический сдвиг влево. Содержимое операнда сдвигается влево на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые влево биты записываются в тот же операнд справа;

2) гог операнд, счетчик_сдвигов (Rotate Right) – циклический сдвиг вправо. Содержимое операнда сдвигается вправо на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые вправо биты записываются в тот же операнд слева.

Рис. 32. Схема работы команд простого циклического сдвига


Как видно из рисунка 32, команды простого циклического сдвига в процессе своей работы осуществляют одно полезное действие, а именно: циклически сдвигаемый бит не только вдвигается в операнд с другого конца, но и одновременно его значение становится значением флага СЕ

Команды циклического сдвига через флаг переноса CF отли чаются от команд простого циклического сдвига тем, что сдвигаемый бит не сразу попадает в операнд с другого его конца, а записывается сначала в флаг переноса СЕ Лишь следующее исполнение данной команды сдвига (при условии, что она выполняется в цикле) приводит к помещению выдвинутого ранее бита с другого конца операнда (рис. 33).

К командам циклического сдвига через флаг переноса соотносятся следующие:

1) rcl операнд, счетчик_сдвигов (Rotate through Carry Left) – циклический сдвиг влево через перенос.

Содержимое операнда сдвигается влево на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса cf.

2) гсг операнд, счетчик_сдвигов (Rotate through Carry Right) – циклический сдвиг вправо через перенос.

Содержимое операнда сдвигается вправо на количество бит, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередно становятся значением флага переноса СF.

Рис. 33. Команды циклического сдвига через флаг переноса CF


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

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

Дополнительные команды сдвига

Система команд последних моделей микропроцессоров Intel, начиная с i80386, содержит дополнительные команды сдвига, расширяющие возможности, рассмотренные нами ранее. Это – команды сдвигов двойной точности: 1) shld операнд_1, операнд_2, счетчик_сдвигов – сдвиг влево двойной точности. Команда shld производит замену путем сдвига битов операнда операнд_1 влево, заполняя его биты справа значениями битов, вытесняемых из операнд_2 согласно схеме на рис. 34. Количество сдвигаемых бит определяется значением счетчик_сдвигов, операнд_2 не изменяется.


Рис. 34. Схема работы команды shld


2) shrd операнд_1, операнд_2, счетчик_сдвигов – сдвиг вправо двойной точности. Команда производит замену путем сдвига битов операнда операнд_1 вправо, заполняя его биты слева значениями битов, вытесняемых из операнд_2 согласно схеме на рисунке 35. Количество сдвигаемых бит определяется значением счетчик_сдвигов, которое может лежать в диапазоне 0… 31. Это значение может задаваться непосредственным операндом или содержаться в регистре cl. Значение операнд_2 не изменяется.

Рис. 35. Схема работы команды shrd


Как мы отметили, команды shld и shrd осуществляют сдвиги до 32 разрядов, но за счет особенностей задания операндов и алгоритма работы эти команды можно использовать для работы с полями длиной до 64 бит.

2. Команды передачи управления

Мы познакомились с некоторыми командами, из которых формируются линейные участки программы. Каждая из них в общем случае выполняет некоторые действия по преобразованию или пересылке данных, после чего микропроцессор передает управление следующей команде. Но очень мало программ работает таким последовательным образом. Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть:

1) безусловным – в данной точке необходимо передать управление не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды;

2) условным – решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.

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

То, какая команда программы должна выполняться следующей, микропроцессор узнает по содержимому пары регистров cs:(e)ip:

1) cs – сегментный регистр кода, в котором находится физический (базовый) адрес текущего сегмента кода;

2) eip/ip – регистр указателя команды, в котором находится значение, представляющее собой смещение в памяти следующей команды, подлежащей выполнению, относительно начала текущего сегмента кода.

Какой конкретно регистр будет использоваться, зависит от установленного режима адресации use16 или use32. Если указано use 16, то используется ip, если use32, то используется eip.

Таким образом, команды передачи управления изменяют содержимое регистров cs и eip/ip, в результате чего микропроцессор выбирает для выполнения не следующую по порядку команду программы, а команду в некотором другом участке программы. Конвейер внутри микропроцессора при этом сбрасывается.

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

1. Команды безусловной передачи управления:

1) команда безусловного перехода;

2) команда вызова процедуры и возврата из процедуры;

3) команда вызова программных прерываний и возврата из программных прерываний.

2. Команды условной передачи управления:

1) команды перехода по результату команды сравнения стр;

2) команды перехода по состоянию определенного флага;

3) команды перехода по содержимому регистра есх/сх.

3. Команды управления циклом:

1) команда организации цикла со счетчиком есх/сх;

2) команда организации цикла со счетчиком есх/сх с возможностью досрочного выхода из цикла по дополнительному условию.

Безусловные переходы

Предыдущее обсуждение выявило некоторые детали механизма перехода. Команды перехода модифицируют регистр указателя команды eip/ip и, возможно, сегментный регистр кода cs. Что именно должно подвергнуться модификации, зависит:

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

2) от указания перед адресом перехода (в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или ячейке памяти (косвенный переход).

Модификатор может принимать следующие значения:

1) near ptr – прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр eip/ip (в зависимости от заданного типа сегмента кода use16 или use32) на основе указанного в команде адреса (метки) или выражения, использующего символ извлечения значения – $;

2) far ptr – прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-битного селектора и 16/32-битного смещения, которые загружаются, соответственно, в регистры cs и ip/eip;

3) word ptr – косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти по указанному в команде адресу, или из регистра) только eip/ip. Размер смещения 16 или 32 бит;

4) dword ptr – косвенный переход на метку в другом сегменте кода. Модифицируются (значением из памяти – и только из памяти, из регистра нельзя) оба регистра – cs и eip/ip. Первое слово/двойное слово этого адреса представляет смещение и загружается в ip/eip; второе/третье слово загружается в cs. Команда безусловного перехода jmp

Синтаксис команды безусловного перехода – jmp [модификатор] адрес_перехода – безусловный переход без сохранения информации о точке возврата.

Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в которой находится указатель перехода.

Всего в системе команд микропроцессора есть несколько кодов машинных команд безусловного перехода jmp.

Их различия определяются дальностью перехода и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором – межсегментным, или дальним. Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip.

Можно выделить три варианта внутрисегментного использования команды jmp:

1) прямой короткий;

2) прямой;

3) косвенный.


Процедуры

В языке ассемблера есть несколько средств, решающих проблему дублирования участков программного кода. К ним относятся:

1) механизм процедур;

2) макроассемблер;

3) механизм прерываний.

Процедура, часто называемая также подпрограммой, – это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи. Процедура представляет собой группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку.

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

Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP.

Синтаксис описания процедуры таков (рис. 36).


Рис. 36. Синтаксис описания процедуры в программе


Из рисунка 36 видно, что в заголовке процедуры (директиве PROC) обязательным является только задание имени процедуры. Среди большого количества операндов директивы PROC следует особо выделить [расстояние]. Этот атрибут может принимать значения near или far и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение near.

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

Условные переходы

Микропроцессор имеет 18 команд условного перехода. Эти команды позволяют проверить:

1) отношение между операндами со знаком («больше – меньше»);

2) отношение между операндами без знака («выше – ниже»);

3) состояния арифметических флагов ZF, SF, CF, OF, PF (но не AF).

Команды условного перехода имеют одинаковый синтаксис:

jcc метка_перехода

Как видно, мнемокод всех команд начинается с «j» – от слова jump (прыжок), ее – определяет конкретное условие, анализируемое командой.

Что касается операнда метка_перехода, то эта метка может находиться только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается. В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода. В ранних моделях микропроцессора (i8086, i80186 и i80286) команды условного перехода могли осуществлять только короткие переходы – на расстояние от -128 до +127 байт от команды, следующей за командой условного перехода. Начиная с модели микропроцессора 80386, это ограничение снято, но, как видите, только в пределах текущего сегмента кода.

Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления.

Источниками такого условия могут быть:

1) любая команда, изменяющая состояние арифметических флагов;

2) команда сравнения стр, сравнивающая значения двух операндов;

3) состояние регистра есх/сх.


Команда сравнения cmp

Команда сравнения стр имеет интересный принцип работы. Он абсолютно такой же, как и у команды вычитания – sub операнде, операнд_2.

Команда стр так же, как и команда sub, выполняет вычитание операндов и устанавливает флаги. Единственное, чего она не делает – это запись результата вычитания на место первого операнда.

Синтаксис команды стр – стр операнд_1, операнд_2 (compare) – сравнивает два операнда и по результатам сравнения устанавливает флаги.

Флаги, устанавливаемые командой стр, можно анализировать специальными командами условного перехода. Прежде чем мы их рассмотрим, уделим немного внимания мнемонике этих команд условного перехода (табл. 16). Понимание обозначений при формировании названия команд условного перехода (элемент в названии команды jcc, обозначенный нами ее) облегчит их запоминание и дальнейшее практическое использование.

Таблица 16. Значение аббревиатур в названии команды jcc
Таблица 17. Перечень команд условного перехода для команды стр операнд_1, операнд_2

He удивляйтесь тому обстоятельству, что одинаковым значениям флагов соответствует несколько разных мнемокодов команд условного перехода (они отделены друг от друга косой чертой в табл. 17). Разница в названии обусловлена желанием разработчиков микропроцессора облегчить использование команд условного перехода в сочетании с определенными группами команд. Поэтому разные названия отражают скорее различную функциональную направленность. Тем не менее то, что эти команды реагируют на одни и те же флаги, делает их абсолютно эквивалентными и равноправными в программе. Поэтому в таблице 17 они сгруппированы не по названиям, а по значениям флагов (условиям), на которые они реагируют.


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

Мнемоническое обозначение некоторых команд условного перехода отражает название флага, с которым они работают, и имеет следующую структуру: первым идет символ «j» (Jump, переход), вторым – либо обозначение флага, либо символ отрицания «n», после которого стоит название флага. Такая структура команды отражает ее назначение. Если символа «n» нет, то проверяется состояние флага, если он равен 1, производится переход на метку перехода. Если символ «n» присутствует, то проверяется состояние флага на равенство 0, и в случае успеха производится переход на метку перехода.

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

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

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


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

Архитектура микропроцессора предполагает специфическое использование многих регистров. К примеру, регистр EAX/AX/AL используется как аккумулятор, а регистры ВР, SP – для работы со стеком. Регистр ЕСХ/СХ тоже имеет определенное функциональное назначение: он выполняет роль счетчика в командах управления циклами и при работе с цепочками символов. Возможно, что функционально команду условного перехода, связанную с регистром есх/сх, правильнее было бы отнести к этой группе команд.

Синтаксис этой команды условного перехода таков:

1) jcxz метка_перехода (Jump if ex is Zero) – переход, если сх нуль;

2) jecxz метка_перехода (Jump Equal есх Zero) – переход, если есх нуль.

Эти команды очень удобно использовать при организации цикла и при работе с цепочками символов.

Нужно отметить ограничение, свойственное команде jcxz/jecxz. В отличие от других команд условной передачи управления команда jcxz/jecxz может адресовать только короткие переходы – на -128 байт или на +127 байт от следующей за ней команды.

Организация циклов

Цикл, как известно, представляет собой важную алгоритмическую структуру, без использования которой не обходится, наверное, ни одна программа. Организовать циклическое выполнение некоторого участка программы можно, к примеру, используя команды условной передачи управления или команду безусловного перехода jmp. При такой организации цикла все операции по его организации выполняются вручную. Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех команд, облегчающую программирование циклов. Эти команды также используют регистр есх/сх как счетчик цикла.

Дадим краткую характеристику этим командам: 1) loop метка_перехода (Loop) – повторить цикл. Команда позволяет организовать циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Работа команды заключается в выполнении следующих действий:

б) сравнения регистра ЕСХ/СХ с нулем: если (ЕСХ/СХ) = 0, то управление передается на следующую после loop команду;

2) loope/loopz метка_перехода

Команды loope и loopz – абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

а) декремента регистра ЕСХ/СХ;

в) анализа состояния флага нуля ZF если (ЕСХ/СХ) = 0 или XF = 0, управление передается на следующую после loop команду.

3) loopne/loopnz метка_перехода

Команды loopne и loopnz также абсолютные синонимы. Работа команд заключается в выполнении следующих действий:

а) декремента регистра ЕСХ/СХ;

б) сравнения регистра ЕСХ/СХ с нулем;

в) анализа состояния флага нуля ZF: если (ЕСХ/СХ) = 0 или ZF = 1, управление передается на следующую после loop команду.

Команды loope/loopz и loopne/loopnz по принципу своей работы являются взаимообратными. Они расширяют действие команды loop тем, что дополнительно анализируют флаг zf, что дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора.

Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz состоит в том, что они реализуют только короткие переходы (от -128 до +127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду jmp, поэтому постарайтесь освоить оба способа организации циклов.

Основы программирования МП устройств (Лекция)

ПЛАН ЛЕКЦИИ

1.Классификация команд микропроцессора

2.Виды адресации

3. Структура и форматы команд МП КР580ВМ80

1.Классификация команд микропроцессора

Как уже отмечалось,принципиальнымдостоинствомМП является программируемость. Этоозначает,чтоподаваяна вход МП команды, можно обеспечить нужную последовательность операций, т.е. реализацию определенного алгоритма.Алгоритмрешаемой задачи может быть сколь угодно сложным,необходимо лишь,чтобы этот алгоритм был разбит на шаги всоответствииссистемой команд МП.Поэтому система команд важна не только с точки зрения, что МП может делать, но и как выполняется алгоритм. Наличие или отсутствие какой–либо команды или группы команд может существенно повлиять навыборМПдляконкретного применения.

Классификация команд МП представлена на рисунке 8.

По числу ячеек памяти,необходимых для размещения одной команды, различают команды длиной в одно, два или три слова. Команды длиной вдваили три слова требуют для выборки соответственно два или три цикла обращения к памяти.

Во многих случаях,в частности при сравнении МП со сходной архитектурой, оказывается полезной классификация команд в соответствии с архитектурными характеристиками МП.

С функциональной точки зрения команды разделяются на трибольшие группы: передачи, управления и обработки данных. Рассмотрим подробно основные команды,применяемые в МП,пользуясь классификацией по функциональным признакам. Названия команд обозначим русскими словами, указывающими на смысл выполняемых операций.

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

К командам связанным с обращением к памяти относятся:

ЗАПОМНИТЬ (ЗАПИСАТЬ), по которой содержимое регистра засылается в ячейку памяти.

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

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

ЗАГРУЗИТЬ НЕПОСРЕДСТВЕННО ,покоторойв регистр записывается константа, указанная в коде команды;

ПЕРЕСЛАТЬ , по которой содержимое одного регистра пересылается в другой.

К командам ввода–вывода относятся:

ВВОД , покоторойсодержимоеустройства ввода засылается во внутренний регистр МП;

ВЫВОД , покоторойсодержимоевнутреннего регистра МП (обычно аккумулятора) пересылается в устройство вывода.

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

К командам безусловного перехода относятся:

БЕЗУСЛОВНЫЙ ПЕРЕХОД (БП),по которой в программный счетчик записывается содержимое адресного поля команды БП, т.е. обеспечивается переход в программе по адресу, указанному в команде;

БЕЗУСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ (переход кподпрограмме),по которой впрограммныйсчетчик записывается новое содержимое (адрес первой команды подпрограммы),но в отличие от команды БПвпамяти сохраняется состояниепрограммногосчетчика и некоторых других регистров. При выполнении подпрограммы по ее последней команде ВОЗВРАТ восстанавливается содержимое программного счетчика и всех регистров.

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

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

УСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ , которая отличается от команды БЕЗУСЛОВНЫЙ ПЕРЕХОД С ВОЗВРАТОМ тем, что переход к подпрограмме происходит только при выполнении указанного условия.

Обычно в систему команд МП включается ещенескольковспомогательных команд, которые позволяют управлять состоянием регистров или триггеров влияющих на выполнение условных переходов, например: УСТАНОВИТЬ ФЛАГ,СБРОСИТЬ ФЛАГ, УСТАНОВИТЬ СТАРШИЙ РАЗРЯД АККУМУЛЯТОРА, СБРОСИТЬ СТАРШИЙ РАЗРЯД АККУМУЛЯТОРА и др.

Команды обработкиданных делятся на арифметические и логические. К арифметическим относятся:

СЛОЖИТЬ содержимое двух регистров или регистра и ячейки памяти;

ВЫЧЕСТЬ из содержимого ячейки памятиилирегистрасодержимое регистра;

УВЕЛИЧИТЬ НА 1 (ИНКРЕМЕНТ) содержимое ячейки памяти или регистра (указателя стека, индексного регистра, аккумулятора);

УМЕНЬШИТЬ НА 1 (ДЕКРЕМЕНТ) содержимое ячейки памяти или регистра;

СЛОЖИТЬ С УЧЕТОМ ПЕРЕНОСА ,по которой выполняетсясложениес учетом состояния триггера переноса. Это позволяет легко организовать обработку чисел большой длины;

ВЫЧЕСТЬ С УЧЕТОМ ЗАЕМА ;

СДВИГ содержимого ячейки памяти или регистра(обычнонаодин разряд).

В подгруппу логических команд входят команды:

И (ЛОГИЧЕСКОЕ УМНОЖИТЬ),по которой выполняется операция конъюнкции между содержимым двух регистров или ячейки памяти и регистра;

ИЛИ (ЛОГИЧЕСКИ СЛОЖИТЬ),по которой выполняется операция дизъюнкции между содержимым двух регистров или ячейки памяти и регистра;

НЕРАВНОЗНАЧНОСТЬ , по которой производится поразрядное сравнение содержимого двух регистров или ячейки памяти и регистра;

ИНВЕРСИЯ содержимого ячейки памяти или регистра.

2.Виды адресации

Одной изважнейших архитектурных характеристик МП является перечень возможных способов обращения к памятииливидовадресации. Возможности МП по адресации существенны с двух точек зрения.

Во–первых, большой объем памяти требует большойдлиныадреса, так какn–разрядный адрес позволяет обращаться к памяти емкостью 2n слов. Типовые 8–разрядные слова МП дают возможностьнепосредственно обращаться только к 256 ячейкам памяти,что явно недостаточно. Если учесть, что обращение к памяти является наиболее часто встречающейся операцией, то очевидно, что эффективность использования МП во многом определяется способами адресации к памяти большого объема прималой разрядности МП.

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

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

Для согласования адресного поля команды малой разрядности с памятью большогообъема (для решения “страничной” проблемы) в МП применяются различные виды адресации:

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

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

Прямая адресация с использованием двойных слов. Для увеличения длины адресного поля команды под адрес отводится дополнительное слово (а если нужно, то и два).

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

Адресация относительно индексного регистра. Исполнительный адрес образуется суммированием содержимого индексного регистра и адресного поля команды,рассматриваемого как целое со знаком. Индексный регистр загружается специальными командами.

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

3. Структура и форматы команд МП КР580ВМ80

Система команд МП серии КР580ВМ80 содержит команды трехформатов: однобайтные,двухбайтные и трехбайтные .

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

Если в выполнении операции участвуют регистры, то один или два из них могут быть указаны в первом байте команды. При этом под номера регистров в поле команды отводятся вполнеопределенныеразряды: три младших разряда (b2 – b0) кодируют номер регистра источника, содержащего операнд, а три средних (b5 – b3) – номер регистра–приемника, вкоторый засылается результат операции.В тех случаях,когда оба или один из этих регистров не участвуют ввыполненииоперации, соответствующие разряды используются под код операции.

Принято следующее кодирование регистров:

000 – регистр В,100 – регистр Н,

001 – регистр С,101 – регистр L,

010 – регистр D,110 – ячейка памяти,

011 – регистр Е,111 – аккумулятор А.

Код 100являетсяпризнаком косвенной адресации к памяти с помощью 16–разрядного адреса,размещенного в регистрах Н и L. В зависимости от расположения этого кода в команде,обращение к соответствующей ячейке памяти производится или за операндом,или для записи результатов операции.

Ряд команд МП предусматриваетобработкуилипередачучисел двойной длины. В этих случаях пары регистров В и С, D и Е или Н и L объединяются в 16–разрядные регистры,имеющие номера 00,01 и10 соответственно. Под номера регистровых пар в командах отводятся разряды b2 и b1 (регистр–источник),b5 и b4 (регистр–приемник), а разряды b0 и b3 используются для указания кода операции.

К двухбайтным командам в МП относятся команды снепосредственной адресациейикоманды ввода–вывода.Соответственно второй байт команды этой группы содержит 8–разрядный операнд или 8–разрядный адрес устройства ввода или вывода.

В трехбайтных командах второй и третий байтысодержат16–разрядные адреса (в командах с прямой адресацией) или 16–разрядные операнды (в командах загрузки регистровых пар и указателя стека).

После выполнения каждойоперацииаАЛУвырабатываетсяпять признаков, значениякоторыхмогут влиять на выполнение последующих команд обработки информации и условной передачиуправления.Однако следует иметь ввиду,что различные команды по–разному влияют на отдельные признаки.

Для удобствасохранения и восстановления состояния МП во время прерываний и перехода к подпрограммам все указанные признакисохраняются вспециальномрегистре– регистре признаков. Расположение признаков в разрядах регистра приведено в таблице.

гдеS – признак “знака” (принимает значениестаршегоразряда

результата);

Z – признак нулевого результата;

АС –признак вспомогательного переноса (если есть перенос

между тетрадами байта, то АС=1, иначе АС=0;

Р – признак четности результата (если число единиц в байте

результата четно, то Р=1, иначе Р=0);

С – признак переноса или заема(если при выполнении коман–

ды возник перенос из старшего разряда или заем в стар–

ший разряд то С=1, иначе С=0).

Примечание: Для команд логического умножения признак вспомогательного переноса АС принимает значение четвертого разряда результата.

Полностью система команд МП серии КР580ВМ80 приведена в приложении учебного пособия "Микропроцессоры и микропроцес­сорные системы". Там же для каждой команды указывается как,после ее выполнения, изменяется значение каждого признака: устанавливается в соответствии с результатом операции (+), не изменяется (–), сбрасывается в нуль (0) или устанавливается в единицу (1).

В общем случае команда должна содержать следующую информацию:

–код операции,указывающий операцию,которую должен выполнить МП;

–адреса двух операндов (слагаемых,вычитаемых и т.д.). Если какой–либо из операндов является константой, то вместо его адреса в команде может быть задано значение самого операнда. Однако это обстоятельство должно быть отобржено в коде операции,что бы МП использовал соответствующую часть команды с указанным ееназначения;

–адрес ячейки памяти в которую должен быть помещен результат операции;

–адрес следующей команды.

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

В системе команд МП серии 580 имеются однобайтные, двухбайтные и трехбайтные команды.

Информация о способе адресации выполняемой команды содержитсяв коде операции первого байта команды.

Для ускорения вычислений некоторые операнды хранятся в блоке РОН. Команды, работающие с этими операндами, используют укороченные адресные коды (регистровую адресацию).

Эти командыпозволяютисключитьсравнительно длинный цикл обращения к ОЗУ и тем самым существенно повысить скорость выполнения операций. В связи с ограниченной разрядностью РОН и при работе с большим массивом данных,используются другие методы адресации, которые позволяют обращаться к операндам, расположенным во внешней по отношению к МП памяти. Наиболее распространенной является косвенная регистровая адресация,которая использует регистровую пару HL.

В группе команд передачи управления различают четыре ти­па команд: безусловные переходы, условные переходы, циклы и прерывания .

Команды безусловных переходов. Включают три мнемокода: JMP (безусловный переход), CALL (вызов подпрограммы) и RET (возврат из подпрограммы).

Команда JMP позволяет осуществить переход в любую точку программы, расположенную как в текущем программном сегмен­те, так и в другом сегменте. При переходе в пределах текущего программного сегмента используются первые три формата ко­манды JMP.

Первый формат обеспечивает переход в произвольную точку программы внутри текущего программного сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разряд­ное смещение, старший разряд которого является знаковым. Вто­рой, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на -128-f-127 адресов от команды JMP. Наконец, третий формат осуществляет загрузку указателя команд 16-разрядным числом, которое размещено по исполни­тельному адресу ЕА, определяемому постбайтом. Этот переход называется косвенным, так как используется косвенная адреса­ция.

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

Четвертый формат определяет прямой межсегментный пере­ход, при котором во втором и третьем байтах формата указан относительный адрес точки перехода, а в четвертом и пятом бай­тах- новое значение CS. Пятый формат с помощью постбайта позволяет определить исполнительный адрес ЕА, по которому на­ходится относительный адрес точки перехода (в байтах памяти с адресами ЕА, ЕА+1), и новое значение CS (в байтах памяти ЕА+2, ЕА+3).

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

Для возврата из подпрограммы используется команда RET, под действием которой происходит передача управления по ад­ресу возврата, занесенному в стек при выполнении предыдущей команды CALL. При возврате из подпрограмм, расположенных в текущем программном сегменте, применяются первые два фор­мата команды RET, причем второй формат отличается от перво­го тем, что к содержимому указателя стека добавляется констан­та, записанная во 2-м и 3-м байтах команды. Это позволяет одновременно с возвратом из подпрограммы сбрасывать пара­метры, записанные в стек при выполнении этой подпрограммы и не используемые в дальнейшем.

Для межсегментного возврата применяются третий и четвер­тый форматы RET, которые обеспечивают восстановление содер­жимого как указателя команд, так и программного сегмента.

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

В мнемокодах команд условных переходов при сравнении чи­сел со знаком для обозначения условия «больше» используется буква G (Greater - больше), а для обозначения - «меньше» буква L (Less - меньше). Для аналогичных условий при сравне­нии чисел без знака используются соответственно буквы A (Abo­ve - над) и В (Below - под). Условие равенства обозначается буквой Е (Equal - равно), а невыполнение некоторого условия - буквой N (Not - не). Следует отметить, что допускается исползование двух различных мнемокодов для каждой команды; на­пример, мнемокоды JL и JNGF - эквивалентны, поскольку ус­ловия «меньше» и «не больше или равно» - идентичны.

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

Таблица 1.4

Мнемокод команды Условие Значение флагов
Для чисел со знаком
JL/JNGE Меньше/не больше или равно SF + OF = l
JNL/JGE Не меньше/больше или равно SF + OF = 0
JG/JNLE Больше/не меньше или равно (SF + OF) V ZF = 0
JNG/JLE Не больше/меньше или равно Для чисел без знака (SF + OF) V ZF = l
JB/JNAE Меньше/не больше или равно CF = 1
JNB/JAE Не меньше/больше или равно CF = 0
JA/JNBE Больше CF V ZF = 0
JNA/JBE Не больше Для прочих данных CF V ZF = 1
JE/JZ Равно/по нулю ZF = 1
JNE/JNZ Не равно/по нулю ZF = 0
JS По минусу SF = 1
JNS По плюсу SF = 0
JO По переполнению OF = l
JNO По отсутствию переполнения OF = 0
JP/JPE По четному паритету PF = 1
JNP/JPO По нечетному паритету PF = 0

Все команды условных переходов имеют одинаковый двух­байтовый формат, в первом байте которого задается код опера­ции (КОП), а во втором - 8-разрядное смещение, которое рас­сматривается как число со знаком и, следовательно, позволяет осуществлять изменение адреса в диапазоне от -128 до +127. При необходимости более отдаленного («дальнего») перехода по выполнению условия используется дополнительно команда безусловного перехода.

Время выполнения каждой из команд условных переходов указано для двух случаев: 1) условие выполнено и управление действительно передается в соответствии со смещением, 2) ус­ловие не выполнено, так что управление передается следующей команде.

Команды организации циклов. Введены в ЦП для удобства выполнения вычислительных циклов. К ним относятся следующие мнемокоды: LOOP (цикл, пока (СХ) не равно 0), LOOPNZ/LOOPNE (цикл, пока не нуль/не равно), LOOPZ/LOOPE (цикл, пока нуль/равно) и JCXZ (переход по нулю в СХ). Каждая из этих команд имеет двухбайтовый формат, во втором байте кото­рого указывается 8-разрядное смещение, используемое для орга­низации перехода. Это смещение рассматривается как число со знаком и перед вычислением адреса перехода оно расширяется со знаком до 16 разрядов.

Используя команды циклов совместно с командами манипу­ляции элементами строк, можно составлять достаточно сложные программы преобразования строк. Рассмотрим пример составле­ния программы для перевода строки данных, записанных в шестнадцатеричной системе счисления, в некоторый код, для которого перекодировочная таблица находится в памяти с начального ад­реса, указанного в ВХ, как это требуется для использования команды табличного преобразования кодов XLAT. Пусть далее исходная строка содержит 80 элементов и находится в памяти с относительного начального адреса 100, а строка-результат дол­жна быть размещена с относительного адреса 200. Программа, выполняющая перекодировку исходной строки в строку-резуль­тат, при значении флага направления DF=0 будет иметь вид:

MOV SI ,100
MOV DI ,200
MOV СХ, 80

Здесь использована команда табличного преобразования кодов XLAT, описанная в 1.2.

Команды прерывания. Включают три мнемокода: INT (пре­рывание), INTO (прерывание при переполнении) и IRET (воз­врат из прерывания).

Команда прерывания INT при v = 1 имеет двухбайтовый фор­мат, второй байт которого содержит 8-разрядное число, определя­ющее тип (type) или уровень прерывания. По команде INT type процессор переходит к выполнению программы обслуживания прерывания указанного уровня, причем автоматически выполня­ются действия, необходимые для обеспечения возврата в точку прерывания. Эти действия состоят в следующем: содержимое регистра флагов F записывается в стек (PUSHF), сбрасывают­ся флаги IF и TF, текущие значения регистра CS и указателя команд IP записываются в стек.

Для определения начального адреса программы обслужива­ния в соответствии со значением type используется таблица уровней прерывания. Для каждого из 256 уровней прерываний в этой таблице от­ведено по четыре байта: первые два байта определяют значение указателя команд IP, вторые - значение сегментного регистра CS. Эта четверка байтов определяет начальные адреса программ обслуживания (пары значений CS, IP), которые должны быть предварительно записаны в ячейки памяти по абсолютным адре­сам 0-3FFH. Адрес таблицы, соответствующий указанному в команде INT type уровню прерывания, определяется в ЦП сле­дующим образом. После запоминания в стеке текущих значений CS и ГР осуществляются загрузки: CS = type x 4 + 2 и IP = type x 4. Новые значения CS и IP, взятые соответственно из ячеек с адресами type x 4 + 2 и type x 4, определяют начальный адрес требуемой программы обслуживания.

Рассмотренная выше команда прерывания INT при значении поля v = 0 имеет однобайтовый формат, т. е. не требует специаль­ного указания уровня прерывания. Эта команда автоматически воспринимается процессором как прерывание третьего уровня (type=3) и обычно используется в программах в качестве контрольной точки.

Команда прерывания при переполнении INTO вызывает пе­реход на обслуживание прерывания четвертого уровня (type = 4) в случае, когда значение флага переполнения OF = 1. Команда INTO обычно используется после арифметических команд над числами со знаком. Обычно несколько первых уровней прерыва­ний (до 32) резервируются под обработку ряда специфических ситуаций, таких, например, как попытка деления на нуль, переполнение и тому подобных.

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

Однобайтовая команда IRET ставится в конце каждой про­граммы обслуживания прерывания и обеспечивает возврат из прерывания. По этой команде процессор извлекает из стека значение указателя команд IP и программного сегмента CS, а также восстанавливает прежнее содержимое регистра флагов F (как и по команде POPF). При необходимости содержимое остальных регистров ЦП, соответствующее прерываемой программе, может быть запомнено в стеке при переходе на программу обслужива­ния и затем восстановлено при возврате из нее с помощью команд обращения к стеку.

По косвенному адресу

PCHL – адрес перехода хранится в регистровой паре HL. При ее выполнении (HL) → PC.

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

Jcon @, где con – мнемоника условия от английского слова condition.

Ранее отмечалось, что в качестве условия перехода используют состояние разрядов (флажков) РгП (F). Мнемоника, соответствующая этим состояниям, представлена на рис. 6.18.

Например: JC 8BFE – при C=1 переход по адресу 8BFE, при C=0 выполняется следующая по адресу команда.

Команды вызова ПП и возврата

Ранее отмечалось, что адрес возврата автоматически сохраняется в стеке, т.е. (PC) ® стек.

Безусловные команды

CALL @ – вызов подпрограммы;

RET – возврат из подпрограммы.

Условные команды

Ccon @ – вызов подпрограммы;

Rcon – возврат из подпрограммы.

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

Прочие команды управления

RST n, где n = 0,1,...,7 – рестарт по вектору прерывания n.

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

Этот адрес задается следующим образом. Команда RST имеет структуру 11NN N111, т.е. один байт. Трехразрядная комбинация NNN задается значением n (n = 0...7). В счетчик команд РС заносится значение 0000 0000 00NN N000, которое служит адресом соответствующего вектора прерывания.

Таким образом, задавая определенное значение n, можно сформировать адрес одного из 8- векторов прерывания. Эти адреса располагаются в зоне от 0000H до 0038H адресного пространства и идут через 8 байт, т.е. под них зарезервированы первые 64 ячейки памяти (каждому из 8- векторов отведено по 8 байт). В этих зонах (по 8 байт) записывают только команды перехода к соответствующим подпрограммам (обработчикам), которые располагаются в других областях памяти.

Прерывающие подпрограммы (как и обычные подпрограммы) обязательно заканчиваются командой RET. В процессе выполнения этой команды адрес команды основной программы, перед которой произошло прерывание, выбирается из стека и передается в регистр адреса РА, а увеличенное на 1 значение заносится в счетчик команд.

EI – разрешение прерывания. Эта команда ставится в начале участка программы, на котором разрешено прерывание. По этой команде триггер разрешения прерывания в УУ МП устанавливается в состояние 1.

DI – запрещение прерывания. Эта команда ставится в конце участка программы, на котором разрешалось прерывание, и сбрасывает триггер в состояние 0.

NOP – "пустая" команда. Осуществляет пропуск 4- тактов. Изменяется только PC.

HLT – останов. Вызывает прекращение выполнения программы и переход в состояние останова. МП отключается от внешних шин адреса и данных (т.е. их буферы переходят в состояние Z). На выходе WAIT (ожидание) устанавливается уровень 1. Это состояние может быть прервано сигналами запуска МП либо переводом его в состояние прерывания.

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ

1. Какие устройства необходимы для создания простейшей микро-ЭВМ?

2. Перечислите 5 вариантов структур микро-ЭВМ.

3. Использование промежуточного интерфейса.

4. Что включает в себя понятие "контроллер ПУ"?

5. Перечислите характеристики процессора I8080.

6. Регистры данных. Их назначение.

7. Регистры признаков. Какие признаки хранятся в этих регистрах?

8. Опишите принцип двунаправленного обмена данными между внутренней и внешней ШД.

9. Какими регистрами программист может пользоваться?

10. Приведите структурную схему микро-ЭВМ на базе МП КР580ВМ80.

11. Из каких тактов состоит машинный цикл?

12. Перечислите форматы данных МП КР580ВМ80.

13. Перечислите форматы команд МП КР580ВМ80.

14. Какие способы адресации используются в МП КР580ВМ80?

15. На какие группы можно разделить команды МП КР580ВМ80?

16. Пересылки однобайтовые. Приведите примеры команд из этой группы.

17. Пересылки двухбайтовые. Приведите примеры команд из этой группы.

18. Какие операции в аккумуляторе вы знаете.

19. Операции в РОН и памяти. Какие операции к ним относятся?

20. Перечислите команды управления.

КОНТРОЛЬНЫЕ ЗАДАНИЯ

1. На листах ответа должны быть указаны номер группы, фамилия студента и номер его варианта.

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

Номера вопросов Таблица 6.1

a n a n-1
1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18
3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17
2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18
3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18
1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17
3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19 1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16
1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19 3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19
4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19 1,9,11,14,20 2,10,12,15,18 3,5,8, 13,17 4,6,7, 14,19
1,8,10,13,17 2,5,7, 14,18 3,6,8, 15,19 4,7,9, 13,16 1,5,12,14,20 2,6,11,15,16 3,7,10,13,17 4,8,9, 14,18 1,7,12,13,18 2,8,10,14,19
3,5,11,15,20 4,6,9, 13,17 2,7,9, 13,20 1,8,11,15,19 4,5,10,15,17 3,6,12,14,16 1,5,9, 13,16 2,6,10,14,17 3,7,11,15,18 4,8,12,13,19

Операция безусловного перехода(БП) относится к операциям безусловной передачи управления и заключается в следующем. В начале операции содержимое СчК, указывающее на команду, которая следует за БП(адрес возврата), пересылается в Р1 АУ в случае, если в программе предусмотрен возврат; это позволяет сохранить адрес возврата путем дальнейшей пересылки содержимого Р1(например, операцией ЗГ) в память. Для этого в первых командах участка пограммы, к которому выполнен переход, должна быть предусмотрена соответствующая операция. На следующем этапе операции из ячейки ОЗУ или ПЗУ с адресом, указанном в команде БП, в СчК считывается содержимое 1-14 разрядов, которое является адресом перехода. По данному адресу далее делается обращение в ПЗУ за командой, к которой осуществляется переход.

Операция сдвига

В формате сдвига(ФСД) кодируются операции «Сдвиг арифметический правый(левый)» «Сдвиг логический правый(левый)». При их выполнении действия производятся над числом, находящимся в АУ. Признаками в команде задаются: направление сдвига(5 р), типы сдвигов(8,9 р) и их количество (1-4 р). В процессе выполнения операции сдвигаются разряды регистра Р2, результат фиксируется в регистрах Р2 и РСм, причем сдвиг вправо осуществляется на 3 разряда одновременно, сдвиг влево- на 1 разряд. Значение 5 разряда, равное «1» определяет сдвиг влево, равное «0» -вправо.

Операции являются циклическими. Количество циклов сдвига подсчитывается счетчиком циклов (СчЦ). Перед выполнением циклической части операции в СчЦ пересылается содержимое 1-5 разрядов команды, содержащей константу и знак сдвига. Далее содержимое Р2 пересылается в РСм. Сам сдвиг осуществляется за счет «косой» переписи содержимого регистров Р2 и Рсм в Р2’ и Рсм’ соответственно. Затем результат сдвига из РСм’ и Р2’ через СМ1 и СМ2 переписывается в Р2 и РСМ. Об окончании операции свидетельствует значение СчЦ =0.

В зависимости от типа сдвига(Л или А) сдвигаются либо все 16 разрядов(Л) либо только 15 разрядов(мантисса) без знакового(А). При А сдвиге вправо освободившиеся старшие разряды заполняются знаком, а при сдвиге влево освободившиеся младшие разряды заполняются нулями. При логическом сдвиге вправо или влево освободившиеся разряды заполняются нулями.

Так же можно программно изменять константу сдвигов.

32 Взаимодействие узлов и элементов структурной схемы процессора СВ при выполнении операций условного перехода.

Операции условного перехода



Выполнение операции начинается с проверки выполнимости условия перехода путем сравнивания значения признака результата предыдущей операции с кодом «маски» в команде. Если условие выполнено, то происходит переход к исполнению команды, адрес которой находится в адресно-операндной части формата ФУП. Если же условие перехода не выполняется, то исполняется команда, следующая в программе за командой «Условный переход».

Команда «Условный переход»(УП) занимает две рядом расположенные ячейки ПЗУ. В первой ячейке содержится команда, во второй адрес перехода. Условный переход определяется комбинацией в 7-9 разрядах команды, условие размещения адреса возврата определяется 6 разрядом.

При выполнении условия адрес перехода заносится в счетчик команд, следовательно код очередной команды будет считан из ячейки с этим адресам. Адрес возврата заносится в Р1, если 6 разряд равен 0 и в Рсм, если значение данного разряда равно единице.

При невыполнении условия перехода следующая команда выбирается из ячейки с кодом адреса i+2. В данном случае указанный код(адрес возврата) заносится в Р1 независимо от значения 6 разряда команды. Последнее определяется алгоритмом работы процессора СВ при расшифровке кода операции УП.

Занесение адреса возврата на РСМ связано с тем, что выход в кодувую шину из АУ имеет только указанный регистр.

Особенностью выполнения операции УП является то, что при наличии в разрядах «маски» команды кода 111 или 000 условный переход вырождается в безусловный или операцию засылки в базовые регистры соответственно. В этих случаях адресам перехода или адресом засылки в базовые регистры является содержимое адресно-операндной части команды(АОЧ).

При выполнении операции засылки в БР содержимое АОЧ пересылается в один или сразу несколько БР в зависимости от содержимого 15-17 разрядов команды. Адрес возврата в данном случае в Р1 и Рсм не пересылается.



Выполнение операции УП как операции БУП может быть использовано в прерываниях для перехода к прерывающим программам. Для этого в 5 разряде команды выставляется признак напрограммированного перехода(ПНП). В этом случае команда считывается в процессор из ПЗУ по сигналу прерывания (НПП). При этом адрес обращения в ПЗУ(адрес прерывания) вырабатывается схемой прерывания процессора.

Особенностью выполнения операции в этом случае является то, что адресом возврата при прерываниях является не адрес команды, следующей за командой в формате ФУП, а адрес команды, перед которой произошло прерывание. Обработка сигнала НПП происходит следующим образом. По этому сигналу схема прерывания процессора вырабатывает адрес прерывания(АПр), равный адресу первой ячейки команды перехода в формате ФУП(i). Этот адрес через коммутатор и регистр адреса ПЗУ передается в память. Адреса прерываний подобраны таким образом, что адрес первой ячейки команды УП(i) является четным, а адрес второй ячейки (i+1) – нечетным. Второй адрес получается путем изменения (аппаратурно) младшего разряда без участия СчК с нуля на единицу. В процессе считывания команды из ПЗУ и ее выполнения содержимое СчК (K+1) запоминается в регистре Р1 АУ, а содержимое второй ячейки команды (i+1), являющееся адресом перехода к команде с адресом j заносится в СчК. По новому содержимому СчК делается обращение в ПЗУ. Таким образом, в регистре Р1 запоминается адрес следующей команды на момент прерывания(K+1). После отработки прерывания этот адрес используется для возврата к прерванной программе.

33 Взаимодействие узлов и элементов структурной схемы процессора СВ при выполнении операций управления процессором и системой.