Символическое имя может использоваться также для представления величины смещения в операндах. В тех случаях, когда операнды команд не определяют явно, какая операция будет выполнена — 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.