Язык ассемблера микропроцессора 8088. Константы с фиксированной запятой. Определение данных и распределение памяти, страница 4

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

В макроассемблере применимы все способы адресации микропроцессора 8088. Он генерирует соответствующие формы машинных команд, основанные на информации, определенной в операндах. Ассемблер выполняет также проверку правильности использования операндов команд для выявления ошибок кодирования. Сообщение об ошибке генерируется, например, если записана операция сложения содержимого 8- и 16-битового регистров или операция между содержимым регистра сегмента и константой. В определенных ситуациях, например когда в операндах используется константа или смещение, ассемблер может вычислить необходимое для их размещения число байтов памяти.

В языке ассемблера МП 8088 любые ссылки в квадратных скобках на регистры базы (ВХ или ВР) или индексные регистры (SI или DI) интерпретируются как один из косвенных или базово-индексных адресов. При этом ассемблером определяется соответствующий исполнительный адрес ЕА операнда. Ниже приведены примеры кодирования команд программы доступа к регистрам и операндам в памяти на языке ассемблера МП 8088 с использованием макроассемблера.

1. Регистровые операнды, 8-битовые (AL, BL, CL, DL, АН, ВН, СН, DH) или 16-битовые (АХ, ВХ, СХ, DX, SI, D1, ВР, SP, CS, DS, ES, SS), могут быть за даны так, как это показано на рис. 3.3.

2.  Непосредственные операнды в виде констант с фиксированной запятой могут задаваться в двоич ном, восьмеричном, десятичном, шестнадцатеричном представлении или в виде строки символов, как это показано на рис. 3.4. Для согласования с длиной операнда-приемника  ассемблер  генерирует соответ ствующие константы (один или два байта).

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

107






Каждое имя для однозначности определения ставляемой им ячейки памяти имеет по крайней мере три атрибута: сегмент, перемещение и тип. Сегмент идентифицирует область памяти емкостью 64 Кбайт, содержащую именованную ячейку. Этим сегментом может быть один из четырех сегментов, адресуемых регистрами CS, DS, ES и SS. Перемещение описывает перемещаемый адрес именованной ячейки памяти относительно начала сегмента. Тип обычно указывает размер области памяти по относительному адресу. Например, тип может иметь значение 1, 2 или 4, что означает размещение по указанному адресу байта, слова или двойного слова. Тип указывает также, где должны быть записаны метка или символическое имя ячейки памяти: только в текущей программе (локальное имя), в других процедурах (внешнее имя) или во всех программах и процедурах (глобальное имя).

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

Макроассемблер имеет операторы BYTE PTR, WORD PTR и DWORD PTR, позволяющие точно указать ассемблеру размер памяти, отводимой операндам, на символические имена которых имеются ссылки: байт, слово или двойное слово соответственно.

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

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

110