Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



Команда безусловного вызова

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

Команда условного вызова

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

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

 

Команды возврата из подпрограмм разделяются на:

u Команды безусловного возврата

u Команды условного возврата

u Команды возврата с пропуском

u Команды возврата после прерывания

Смешанные команды

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

u нет операции

u запись в стек

u получение из стека

u останов

u ожидание

u захват (программное прерывание)

u другие, не попавшие в описание ранее категории команд.

Способы адресации

Косвенная адресация

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

Таким образом, этот процесс всегда включает два шага. Кроме того, можно использовать также пары регистров В и D в командах LDAX и STAX.

Индексная адресация

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

Предувеличение

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

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

Послеувеличение

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

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

Предуменьшение

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

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

Послеуменьшение

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

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

Косвенная адресация с предварительным индексированием (предындексирование)

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

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

Косвенная адресация с последующим индексированием (послеиндексирование)

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

Директивы

Директивы являются указаниями Ассемблеру о том, как проводить ассемблирование.

Директив может быть великое множество. В 1-м приближении мы рассмотрим лишь несколько практически обязательных директивы (мнемоники директив везде — условные, в конкретных Ассемблерах те же по смыслу директивы могут иметь другие мнемоники).

EQU
Определение имени

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

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

DD
Определение данных

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

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

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

В отличие от других, эта директива приводит непосредственной к генерации некоторого выходного кода — значений данных.

BSS
Резервирование памяти

Выделяются ячейки памяти, но значения в них не записываются. Объем выделяемой памяти определяется операндом директивы.

Перед директивой может стоять метка/имя.

END
Конец программного модуля

Указание Ассемблеру на прекращение трансляции. Обычно в модуле, являющемся главным (main) операндом этой директивы является имя точки, на которую передается управление при начале выполнения программы. Во всех других модулях эта директива употребляется без операндов.

Директивы определения данных

Сегмент данных предназначен для определения констант, рабочих полей и областей для ввода-вывода. В соответствии с имеющимися директивами в Ассемблере разрешено определение данных различной длины: например, директива DB определяет байт, а директива DW oпределяет слово. Элемент данных может содержать непосредственное значение или константу, определенную как символьная строка или как числовое значение.

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

MOV AL, 20H

В этом случае шестнадцатеричное число 20 становится частью машинного объектного кода. Непосредственное значение ограничено oдним байтом или одним словом, но там, где оно может быть применено, оно является более эффективным, чем использование конcтанты.

Ассемблер обеспечивает два способа определения данных: во-первых, через указание длины данных и, во-вторых, по их cодержимому. Рассмотрим основной формат определения данных:

[имя] Dn выражение

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

Для определения элементов данных имеются следующие директивы: DB (байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT (десять байт).

Выражение может содержать константу, например:

FLD1 DB 25

или знак вопроса для неопределенного значения, например

FLDB DB?

Выражение может содержать несколько констант, разделенных запятыми и ограниченными только длиной строки:

FLD3 DB 11, 12, 13, 14, 15, 16, ...

Ассемблер определяет эти константы в виде последовательности cмежных байт.

Ссылка по имени FLD3 указывает на первую константу, 11, по FLD3+1 — на вторую, 12. (FLD3 можно представить как FLD3+0). Например команда

MOV AL, FLD3+3

загружает в регистр AL значение 14 (шест. 0E). Выражение допускает также повторение константы в следующем формате:

[имя] Dn число-повторений DUP (выражение)...

Следующие три примера иллюстрируют повторение:

DW 10 DUP(? ); Десять неопределенных слов

DB 5 DUP(14); Пять байт, содержащих шест.14

DB 3 DUP(4 DUP(8)); Двенадцать восьмерок

В третьем примере сначала генерируется четыре копии десятичной 8 (8888), и затем это значение повторяется три раза, давая в pезультате двенадцать восьмерок.

Выражение может содержать символьную строку или числовую константу.

Символьные строки

Символьная строка используются для описания данных, таких как, например, имена людей или заголовки страниц. Содержимое строки oтмечается одиночными кавычками, например, 'PC' или двойными кавычками — " PC".

Ассемблер переводит символьные строки в объектный код в обычном формате ASCII.

Символьная строка определяется только директивой DB, в котоpой указывается более двух символов в нормальной последовательности слева направо. Следовательно, директива DB представляет единственно возможный формат для определения символьных данных.

Числовые константы

Числовые константы используются для арифметических величин и для aдресов памяти. Для описания константы кавычки не ставятся. Ассемблер преобразует все числовые константы в шестнадцатеричные и записывает байты в объектном коде в обратной последовательности — справа налево. Ниже показаны различные числовые форматы.

Десятичный формат

Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D, которую можно не указывать, например, 125 или 125D. Несмотря на то, что Ассемблер позволяет кодирование в десятичном формате, он преобразует эти значения в шест. объектный код. Например, десятичное число 125 преобразуется в шест.7D.

Шестнадцатеричный формат

Шестнадцатеричный формат допускает шест. цифры от 0 до F и обозначается последней буквой H.

Так как Ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шест. константы должна быть цифра от 0 до 9. Например, 2EH или 0FFFH, которые Ассемблер преобразует соответственно в 2E и FF0F (байты во втором примере записываются в объектный код в обратной последовательности).

Двоичный формат

Двоичный формат допускает двоичные цифры 0 и 1 и обозначается последней буквой B. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах AND, OR, XOR и TEST. Десятичное 12, шест. C и двоичное 1100B все генерируют один и тот же код: шест. 0C или двоичное 0000 1100 в зависимости от того, как вы рассматриваете содержимое байта.

Восьмеричный формат

Восьмеричный формат допускает восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, например, 253Q. На сегодня восьмеричный формат используется весьма редко.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 1317; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.032 с.)
Главная | Случайная страница | Обратная связь