Э. Таненбаум - Архитектура компьютера (1127755), страница 194
Текст из файла (страница 194)
Возьмем для примера команды копирования и сложения: нот ях,зх яээ сх.20 Первые операнды в этих командах являются приемниками, а вторые — источниками. (Их очередность не принципиальна; она с тем же успехом могла бы быть обратной.) Очевидно, что в таком случае приемник является левым значением, то есть в этом месте должно располагаться перезаписываемое значение. Следовательно, целевые операнды, в отличие от исходных, не могут быть константами. В первоначальном проектном решении 8088 один из операндов в случае, если в команде их два, обязательно должен был быть регистром.
Предполагалось, что это требование позволит различать команды обработки байтов и слов, исходя из того, является ли адресуемый регистр регистром для байтов или для слов. В первой версии процессора это правило соблюдалось с неимоверной строгостью. Невозможно было даже ввести в стек константу, поскольку в таком случае ни в одном из двух операндов команды не было бы ни одного регистра. В последующих версиях ограничения были смягчены, но сам принцип оказал определенное влияние на конструктивное решение процессора. В некоторых случаях один из двух операндов не упоминается. Например, в команде МО~В роль приемника может выполнять только регистр АХ. Существуют также команды с одним операндом.
В эту категорию входят, помимо прочего, команды приращения, сдвига и сброса. В этих командах требование о применении регистра в качестве операнда не действует, и различать команды обработки байтов и слов можно только по кодам операций (то есть типам команд). Процессор 8088 поддерживает четыре базовых типа данных: байт, слово (2 байта), длинное слово (4 байта) и двоично-десятичиое число, в котором в слово упаковываются 2 десятичные цифры. Последний тип не поддерживается интерпретатором. Адрес в памяти всегда соответствует байту, но в случае с обычным или длинным словом также присутствует неявное указание на ячейки памяти, находящиеся непосредственно над указанным байтом.
К примеру, слово, расположенное по адресу 20, занимает ячейки памяти 20 и 21. Длинное слово по адресу 24 занимает ячейки 24, 25, 26 и 27. Процессор 8088 является системой с обратным Память и адресация 765 Таблица В.1. Режимы адресации операндов (символ № означает численное значение или метку) Ре!ким адресации Операнд Примеры Регистровая адресация По ре~истру для байтов Регистр для байтов АН, Аь, ВН, В(, СН, С!., ОН, О!. АХ, ВХ, СХ, ОХ, ВР, ВР, 8(, О! Регистр для слов По регистру для слов Адресация сегментов данных Непосредственная адресация Адрес после кода операции (№) (80, (00, (Вх) Косвенная регистровая адресация Регистровая адресация со смещением Адрес в регистре №(8!), №(О!), №(ВХ) Адрес формируется по значению регистра со смещением (ВХ)(8!), (ВХ)(0!) №(ВХ)(8!), №(ВХ)(0!) Адрес формируется путем сложения ВХ с 8(/О! ВХ плюс 8! О! плюс смещение Индексная регистровая адресация Индексная регистровая адресация со смещением Адресация стокового сегмента Косвенная адресация Адрес в регистре по указателю базы Смещение указателя базы (ВР) Адрес формируется по значению ВР и смещения №(ВР) (ВРХ8!), (ВРИО!) №(ВР)(8!), №(ВР)(0!) Ащзесация по указателю базы с индексом Смещение индекса указателя базы Непосредственная адресация данных По непосредственному Информационная часть байту/слову команды Адрес формируется путем сложения ВР и 8(/О! ВР плюс 8)/О! плюс смещение Неявная адресация РОВН, РОР, РОВНР, РОРР (АНР, 8ТС, С!.С, СМС Косвенный адрес (ВР) Команда введения в стек или выталкивания из стека Флаги загрузки или сохранения Регистр с флагами состояния Продолжение и".
порядком следования байтов (!!сйе епг((ап); это означает, что часть слова меньшего порядка хранится по младшему адресу. В стековом сегменте слова должны размещаться по четным адресам. Комбинация АХ 0Х, где в АХ содержится слово меньшего порядка, является единственно возможным вариантом размещения длинных слов в регистрах процессора 8088. В табл. В.1 представлены все предусмотренные в 8088 режимы адресации. Далее мы вкратце их рассмотрим.
В верхних строках таблицы перечислены регистры. Они могут быть задействованы в качестве источников или приемников практически во всех командах. Имеются 8 регистров для слов и столько же для байтов. 766 Приложение В. Программирование на языке ассемблера Таблица В.1 (продолжение) Режим адресации Операнд Примеры Трансляция ХВАТ А!., ВХ (8!), (О!), (СХ) Х(АТ Повторяющиеся строковые команды МОЧВ, СМРВ, ВСАВ !и №, 0()Т № С ВЧЧ, СЧЧО Входные н выходные АХ, АС команды Преобразование байта, слова АЦ АХ, ОХ В строках под заголовком «Адресация сегментов данных» перечислены режимы адресации, актуальные для сегментов данных. Адреса этого типа всегда заключаются в пару круглых скобок — именно они позволяют отличить адрес в их составе от значения иного типа.
Г1ростейХпим режимом адресации из этой категории является непосредственная адресация, при которой адрес данных операнда включается в команду. Пример; АОО СХ,(20) Однако эта команда выражает совершенно другую операцию, а именно— прибавление к значению регистра СХ константы 20, а не содержимого слова памяти, находящегося по адресу 20. Символ Ф в табл. В.1 может обозначать численную константу, метку или константное выражение с меткой. При косвенной регистровой адресации адрес операнда хранится в одном из трех регистров: ВХ, 51 или 01. Во всех этих случаях он оказывается в сегменте данных.
Кроме того, можно разместить константу перед регистром, и в этом случае адрес устанавливается путем сложения регистра с константой. Этот тип адресации, называемый регистровой адресацией со смещением, удобен при обработке массивов. Так, если регистр 51 содержит значение 5, то пятый символ строки, определяемой меткой ЕОйИАТ, можно загрузить в регистр АС посредством оператора нОЧВ А!С.РОВИАТ(51) При этом просмотр всей строки осуществляется на каждом этапе путем положительного или отрицательного приращения значения регистра.
При использовании операндов-слов значение регистра каждый раз изменяется в ту или иную сторону на 2. Кроме того, можно поместить базу Сто есть нижний числовой адрес) массива в регистр ВХ, сохранив регистры 51 или 01 для отсчета. Такая схема называется индексной регистровой адресацией. Пример: Р05Н (ВХ)(01) В данном случае к регистру СХ прибавляется содержимое слова памяти, расположенного по адресам 20 и 21. В языке ассемблера ячейки обычно выражаются метками, а не численными значениями, а преобразование выполняется уже в период ассемблирования.
Даже в командах САСС и ЛИР целевой операнд можно сохранить в ячейке памяти, на которую указывает метка. Скобки вокруг меток совершенно необходимы (по крайней мере, для того ассемблера, о котором мы ведем речь), поскольку следующая команда тоже имеет право на существование: АОО СХ,20 Память и адресация 767 Этот код извлекает содержимое ячейки из сегмента данных с адресом, который определяется суммой регистров ВХ и 01. Результирующее значение затем помещается в стек. Сочетание последних двух типов адресации дает индексную регистровую адресацию со смещением: ИОТ 20(ВХ)(01) Эта команда обращается к слову памяти по адресам ВХ + 01 + 20 и ВХ + 01 + 21. Все способы косвенной адресации, применимые к сегменту данных, актуальны н для стекового сегмента; в последнем случае базовый регистр ВХ заменяется указателем базы ВР.
Таким образом, (ВР) — это только режим косвенной адресации стека регистров, однако существуют и более сложные режимы, в частности, косвенная адресация по указателю базы с индексом и смещением:?1(ВР) (51). Эти режимы полезны при обращении к локальным переменным и параметрам функций, хранящихся по адресам стека в подпрограммах.
Соответствующая схема описывается в подразделе «Вызовы подпрограмм», Все адреса, соответствующие перечисленным режимам адресации, в операциях могут выступать в качестве как источников, так и приемников. Взятые вместе, эти две категории называются действительными адресами. Режимы адресации двух оставшихся категорий не предполагают наличие приемников, поэтому соответствующие адреса не входят в число действительных.
Они применяются только в качестве источников. Режим адресации, при котором операндом является константный байт или значение слова, называется непосредственной адресацией. Например: СМР АХ.50 Эта команда сравнивает значение в регистре АХ с константой 50 н в зависимости от результата устанавливает биты во флаговом регистре. Наконец, некоторые команды используют неявную адресацию. В таких командах операнд или операнды лишь подразумеваются. К примеру: РО5Н АХ Эта команда вводит содержимое регистра АХ в стек; для этого она уменьшает значение 5Р на единицу, а затем копирует содерхсимое АХ в ячейку, на которую теперь указывает 5Р.
При этом регистр 5Р в команде не упоминается. Аналогичным образом, регистр флагов состояния не упоминается в командах управления флагами. Неявные операнды применяются и в других командах. В процессоре 8088 предусмотрены специальные команды для перемещения (ИОЧ5), сравнения (СИР5) и просмотра (5СА5) строк. После выполнения этих строковых команд содержимое индексных регистров 51 и 01 автоматически обновляется. Этот механизм называется, в зависимости от направления, автоинкрементным или автодекрементным режимом. Направление приращения (положительное или отрицательное) регистров 51 и 01 определяется флагом направления в регистре флагов состояния. Флаг направления с нулевым значением определяет положительное приращение, а флаг с единичным значением — отрицательное.
Величина приращения составляет 1 в командах для байтов и 2 в командах для слов. В некотором смысле указатель стека также имеет отношение к автоннкрементному и автодекрементному режимам: его значение уменьшается на 2 в начале операции РО5Н и увеличивается на 2 по окончании операции РОР. 768 Приложение В. Программирование на языке ассемблера Набор команд 8088 Любой компьютер характеризуется, в первую очередь, набором команд, которые он способен выполнять. Чтобы понять, как работает компьютер, необходимо основательно изучить его набор команд. В этом разделе мы обсудим наиболее важные команды 8088. Некоторые из этих команд представлены в табл. В.2, где они подразделяются на 10 групп.