Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по архитектуре.docx
Скачиваний:
8
Добавлен:
16.04.2019
Размер:
258.32 Кб
Скачать

52. Синтаксис ассемблера. Структура программы на языке Ассемблера.

Структура и образ памяти программы .ЕХE

Программы, выполняемые под управлениемMS-DOS, могут принадлежать к одному из двух типов, которым соответствуют расширения имен программных файлов .СОМ и .ЕХЕ. Основное различие этих программ заключается в том, что программы ти­па .СОМ состоят из единственного сегмента, в котором разме­щаются программные коды, данные и стек, а в программах ти­па .ЕХЕ для собственно программы, данных и стека предусма­триваются отдельные сегменты. Таким образом, размер про­граммы типа .СОМ не может превысить 64 Кбайт, а размер программы типа .ЕХЕ практически не ограничен, так как в нее может входить любое число сегментов программы и дан­ных.

Структура типичной программы типа .ЕХЕ на языке ассем­блера выглядит следующим образом.

titleПрограмматипа .ЕХЕ

text segment 'code'

assume CS:text, DS:data

mургос proc

mov AX,data

mov DS, AX

;Текст программы

. . .

;Определения данных

myprocendp

text ends

data segment

. . .

data ends

stack segment stack 'stack*

dw 128 dup (0)

stackends

endmyproc

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

- тексты программ набраны строчными буквами, за исклю­чением обозначений регистров (AX, CS) и имен файлов (MYFILE.TXT), которые для наглядности выделены прописными буквами;

- в тексте книги (но не в программах) прописными буквами выделены зарезервированные слова, т.е. операторы языка ассем­блера (SEGMENT, ENDS, MOV и т.д.), а также имена фай­лов.

Рассмотрим теперь структуру приведенной программы. Опе­раторTITLE позволяет предпослать программе текстовый заго­ловок, который будет выводиться на все страницы листинга трансляции. Программа состоит из трех сегментов: сегмента ко­манд, или программного сегмента с произвольным именемtext, сегмента данных с именемdata и сегмента стека с именем stack (оба эти имени также могут выбираться произвольно). Каждый сегмент открывается операторомSEGMENT и закрыва­ется операторомENDS. Перед обоими операторами должно сто­ять имя сегмента. Порядок сегментов в большинстве случаев роли не играет.

Слово 'CODE', стоящее в апострофах в строке описания сег­мента команд, указывает класс сегмента - "программный".

Текст сегмента команд начинается с оператораASSUME, ко­торый позволяет транслятору сопоставить сегментные регистры и адресуемые ими сегменты. ОпределениеCS:text указывает транслятору, что данный сегмент является программным и бу­дет адресоваться с помощью сегментного регистра CS. Опреде­лениеDS:data закрепляет за сегментомdata сегментный регистр DS, как регистр, используемый по умолчанию, что позволяет ссылаться на переменные, описанные в сегментеdata, без яв­ного указания регистра DS. При этом ассемблер проверяет, действительно ли они описаны в сегментеdata.

Собственно программа обычно состоит из процедур. Деление программы на процедуры не обязательно, но повышает ее на­глядность и облегчает передачу управления на подпрограммы и в другие программные модули

Сегмент данных содержит описания всех переменных, ис­пользуемых в программе. Способы описания данных будут рас­смотрены ниже.

Строка описания сегмента стека должна содержать класс сег­мента - 'STACK', а также тип объединения -STACK. Тип объединения указывает компоновщику, каким образом должны объединяться одноименные сегменты разных модулей - накладываясь друг на друга (тип объединенияCOMMON) или присо­единяясь друг к другу (тип объединенияSTACK для сегментов стека илиPUBLIC для всех остальных). Хотя для одномодуль­ных программ тип объединения значения не имеет, для сегмен­та стека обязательно указание типаSTACK, поскольку в этом случае при загрузке программы выполняется автоматическая инициализация регистровSS (адресом начала сегмента стека) и SP (смещением конца сегмента стека).

Текст программы заканчивается директивойEND, завершаю­щей трансляцию. В качестве операнда этой директивы указыва­ется точка входа в главную процедуру.

Образ программы в памяти начинается с префикса програм­много сегмента (ProgramSegmentPrefics, PSP), образуемого и заполняемого системой. PSP всегда имеет размер 256 байтов содержит таблицы и поля данных, используемые системой в процессе выполнения программы. Некоторые из этих полей бу­дут описаны ниже. Вслед за PSP располагаются сегменты про­граммы. Сегментные регистры автоматически инициализируются следующим образом:ES и DS указывают на начало PSP (чтодает возможность, сохранив их содержимое, обращаться затемiпрограмме кPSP), CS - на начало сегмента команд,aSS - на начало сегмента стека. В указатель командIP загружается от­носительный адрес точки входа в программу (из операнда ди­рективыEND), а в указатель стекаSP - смещение конца сег­мента стека. Таким образом, после загрузки программы в па мять адресуемыми оказываются все сегменты, кроме сегмента данных. Инициализация регистраDS в первых строках про­граммы, позволяет сделать адресуемым и этот сегмент.

Структура и образ памяти программы .СОМ Как уже отмечалось, программа типа .СОМ отличается от программы типа .ЕХЕ тем, что содержит лишь один сегмент включающий все компоненты программы: PSP, программный код (т.е. оттранслированные в машинные коды программныестроки), данные и стек. Структура типичной программы типа •СОМ на языке ассемблера выгля­дит следующим образом:

title Программатипа .СОМ

text segment 'code'

assume CS:text,DS:text

org lOOh

myproc proc

; Текстпро­граммы

myproc endp

… ;Определения данных

text ends

end myproc Программасодержит единственный сегментtext, которому присвоен класс 'CODE'. В оператореASSUME указано, что сегментные регистры CS и DS будут указывать на этот единственный сегмент. Оператор ORG lOOh резервирует 256 байт дляPSP. ЗаполнятьPSP будет по-прежнему система, но место под него в начале сегмента должен отвести программист. В программе нет необходимости инициализировать сегментный ре­гистрDS, поскольку его, как и ос­тальные сегментные регистры, инициализирует система. Данные можно разместить после программной процедуры (как это показано на рисунке), или внутри нее, или даже перед ней. Следует только иметь в виду, что при загрузке программы типа .СОМ регистрIPвсегда инициализируется числомlOOh, поэтому сразу вслед за операторомORG lOOh должна стоять первая выполнимая строка программы. Если данные желательно расположить в начале про­граммы, перед ними следует поместить оператор перехода на реальную точку входа, напримерJMPentry.

После загрузки программы все сегментные регистры указывают на начало единственного сегмента, т.е. фактически на начало PSP. Указатель стека автоматически ини­циализируется числом FFFEh. Таким образом, независимо от фактического размера программы ей выделяется 64 Кбайт адресного пространства, всю нижнюю часть которого занимает стек. Поскольку верхняя гра­ница стека не оп­ределена и зависит от интенсивности и спосо­ба использования стека программой, следует опасаться затира­ния сте­ком нижней части программы. Впрочем, такая опасность существует и в программах типа .ЕХЕ.