Государственное Образовательное Учреждение высшего профессионального образования Московский Авиационный Институт Государственный Технический Университет "маи" кафедра 304. конспект
Вид материала | Конспект |
СодержаниеСтруктура программы на языке Ассемблера ENDS указывает на конец текста сегмента. Общий вид { мет. сегм.} ENDS 4) Директива END |
- Инновационной образовательной программы, 1090.47kb.
- Самостоятельная работа 2 часа в неделю всего часов, 28.69kb.
- Самостоятельная работа 2 часа в неделю всего часов, 45.89kb.
- Самостоятельная работа 2 часа в неделю всего часов, 73.46kb.
- Самостоятельная работа 2 часа в неделю всего часов, 46.6kb.
- Самостоятельная работа 2 часа в неделю всего часов, 41.37kb.
- Самостоятельная работа 2 часа в неделю всего часов, 41.08kb.
- Самостоятельная работа 2 часа в неделю всего часов, 64.33kb.
- Самостоятельная работа 2 часа в неделю всего часов, 29.72kb.
- Самостоятельная работа 2 часа в неделю всего часов, 33.42kb.
Структура программы на языке Ассемблера
Исходный файл на ЯА состоит из сегментов. В простейшем случае это – один сегмент, который содержит обязательные элементы.
{мет. сегм.} SEGMENT ’code’
ASSUME CS:{ мет. сегм.}, DS:{ мет. сегм.}
{мет. начала} MOV AX, { мет. сегм.};
MOV DS,AX;
………………
MOV AX,{код функции};
INT 21h
……………
… DW …
… DB …
{ мет. сегм.} ENDS
END { мет. начала}
Рассмотрим директивы оформления программы:
1) директива SEGMENT для ассемблеров MASM или TASM имеет одинаковую структуру
{мет. сегм.} SEGMENT [{счетн.}] [{комб.}] [‘{класс}’] ,где
{мет. сегм.} - это имя сегмента, которое трактуется как метка, т.к. используется для передачи управления. Атрибуты необязательны, но, если они есть, то очередность должна сохраняться.
{счетн.} – определяет метод выравнивания данного сегмента, т.е. начальный адрес сегмента.
Возможны следующие варианты:
Значение атрибута | Граница | Использование | Примечания | ||
Название | Нач. адрес | MASM | TASM | ||
Byte | Байт | Любой | + | + | Не рекомендуется |
Word | Слово | Четный | + | + | |
Para | Параграф | Кратный 16 | + | + | По умолчанию |
Page | Страница | Кратный 256 | + | + | |
Dword | Двойное слово | Кратный 4 | _ | + | |
{комб.} – показывает, как данный сегмент должен объединяться с другим, имеющим ту же метку, но из другого исходного файла.
Ограничение: размер области ОП, которая получается в результате объединения сегментов, не должна превышать 64 Кбайта. Если нет атрибута {комб.}, то сегмент не объединяется с другими.
Возможны варианты атрибута: PRIVATE, PUBLIC, COMMON, STACK и др.
‘{класс}’ – указывается в апострофах, помогает компоновщику определить нужный порядок расположения сегментов при сборке из разных модулей. При этом все сегменты с одинаковым классом объединяются в один последовательно, а с различными классами – располагаются, как правило, в алфавитном порядке.
Часто используются классы:
‘Code’ – сегмент команд;
‘Stack’ – сегмент команд;
‘Data’ – сегмент данных.
Класс сегмента необходимо указывать для правильной обработки файла.
Например, MASM требует наличия класса ‘Code’, т.к. без этого не может работать отладчик Code View (CV), а компоновщик TLINK, входящий в TASM, не инициализирует сегмент стека, если не объявлен класс ‘Stack’.
2) директива ASSUME нужна для выполнения команд программы, которые неявно ссылаются на сегментные регистры МП (т.е. в примере – DS и CS). Она обеспечивает передачу адресов сегментов с соответствующими именами в сегментные регистры.
Общий вид
ASSUME CS:{ мет.}[, {сег. рег.}:{ мет.}]
В приведенном примере эта директива означает, что DS и CS указывают на один и тот же сегмент, причем в CS адрес начала сегмента загружается автоматически, а в DS для этого требуются обычно две инструкции в самом начале сегмента:
mov AX,{метка}
mov DS,AX
ASSUME может быть расположен до начала первого сегмента. В многосегментных программах ASSUME может описывать следующие сегменты
-
Сег.рег.
Сегмент
Загрузка адреса
CS
Рг сегмента команд
автоматическая
DS
Рг сегмента данных
в программе
ES
Рг доп. сегмента данных
в программе
SS
Рг сегмента стека
автоматическая
3) Директива ENDS указывает на конец текста сегмента. Общий вид
{ мет. сегм.} ENDS
4) Директива END указывает на конец текста исходного модуля (ИМ). Общий вид
END { мет. начала}
где { мет. начала} – пусковой адрес, т.е. метка первой выполняемой строки ИМ, которой передается управление после компоновки.
Эта директива нужна, т.к. декларации описания ООП (DB, DW …) могут располагаться в начале или в конце сегмента команд, причем рекомендуется – в начале. Декларации можно вставлять и в текст между командами, но это – не корректно.
Обычно программы состоят из 3-х сегментов (возможно 4-х): команд, данных и стека. Расположение сегментов в принципе свободное, но рекомендуется:
- сегмент данных,
- дополнительный сегмент данных,
- сегмент команд,
- сегмент стека, т.к. он может быть описан без расхода памяти.
Например,
Stack SEGMENT stack ‘stack’
DW 128 dup(?)
Stack ENDS
Объем стека обычно указывается в словах и не должен превышать 64КБ. Здесь имя сегмента совпадает с атрибутами, что не запрещено; далее stack – комбинаторный атрибут, который позволяет компоновщику объединить стековые сегменты из разный ИМ (исходных модулей) в один стековый сегмент. Кроме того, при загрузке программы выполняется автоматическая инициализация регистров SS и SP.
‘Stack’ - класс сегмента для TLINK.