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




Символическое имя может использоваться также для представления величины смещения в операндах. В тех случаях, когда операнды команд не определяют явно, какая операция будет выполнена — 8- или 16-битовая, ассемблеру должны быть заданы операторы типа BYTE PTR или WORD PTR.

5.  Строковые команды, такие, как LODS, STOS, MOVS, CMPS или SCAS, не указывают точно, будут операции выполняться с байтами или словами. Чтобы машинные коды генерировались правильно, в языке ассемблера МП 8088 к строковой команде добав ляют  букву  В (байт)   или  W (слово).  Несколько примеров  записи   строковых  команд приведено на рис. 3.8.

Префиксные команды, такие, как LOCK, REP, REPE или REPNE, могут записываться в утверждении языка ассемблера вместе со строковой командой. Сегментный префикс может быть задан вместе с любой строковой командой, кроме STOS, чтобы избежать искажения информации в ячейке памяти, в которой нельзя изменить сегмент данных, содержащий ячейку памяти, адресуемую регистром SI. В особом случае, при использовании команды STOS, перемещае* мый адрес, заданный регистром DI, берется относительно дополнительного сегмента.

112








Сегменты и процедуры

Программы, написанные на языке ассемблера МП 8088, могут быть разделены на один или несколько сегментов. Каждый логический сегмент имеет единственным образом определяемое имя и однозначно отображается в сегментах памяти при загрузке программы для ее выполнения. Для определения начальной и конечной ячеек логического сегмента в макроассемблере предусмотрены директивы SEGMENT и ENDS (End Segment — окончание сегмента). Все команды и/или данные, размещенные между директивами SEGMENT и ENDS, образуют логический сегмент программы.

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

Пример типовой программы на языке ассемблера МП 8088, содержащей четыре логических сегмента, приведен на рис. 3.9. Директива ASSUME используется для указания ассемблеру, какому сегменту принадлежит тот или иной сегментный регистр. Возможно размещение всей программы в одном сегменте памяти. В этом случае директива ASSUME указывает ассемблеру, что все сегментные регистры адресуют один и тот же сегмент (рис. 3.10).

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

116


Приведенная программа содержит четыре логических

;сегмента:

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

;сегмент данных с символическим именем DATA_SEG

дополнительный сегмент с символическим именем

;EXTRA_SEG

;стековый сегмент с символическим именем STACK_SEG

main      segment

assume cs:main,ds:data_sec, es:extra_seg,ss:stack-seg

Начало      программы

MOV AX,DATA_SEG

MOV DS,AX

MOV AX,EXTRA_SEG

MOV ES,AX

MOV AX,STACK_CEG

MOV SS,AX

MOV SP,OFFSET TOP_OF_STACK

;B этой области должны быть записаны команды основной ;программы

MAIN         ENDS ; Начало  сегмента данных

data_seg segment byte

DB 25 DUP(0) DATE_SEG ENDS

Начало дополнительного сегмента

EXTRA_SEG SEGMENT DATA_AREA DB 2000 DUP(0) EXTRA_SEG ENDS

;Далее следует стековый сегмент

STACK_SEG SEGMENT

DB 64 DUP('STACK ') TOP_OF_STACK DW ? STACK-SEG ENDS END

Рис.  З.9.  Программа • на   языке  ассемблера  8088  с четырьмя логическими сегментами,

117