Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
arkhitektura.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.89 Mб
Скачать
  1. Синтаксис ассемблера. Структура программы на языке Ассемблера.

Язык ассе́мблера — машинно-ориентированный язык низкого уровня с командами, обычно соответствующими командам машины, который может обеспечить дополнительные возможности вроде макрокоманд.Программы, выполняемые под управлением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, поскольку его, как и ос­тальные сегментные регистры, инициализирует система. Поскольку верхняя граница стека не определена и зависит от интенсивности и спосо­ба использования стека программой, следует опасаться затирания стеком нижней части программы. Впрочем, такая опасность существует и в программах типа .ЕХЕ.Синтаксис языка ассемблера определяется системой команд конкретного процессора.Набор команд.Типичными командами языка ассемблера являются:Команды пересылки данных (mov и др.)Арифметические команды (add,sub,mul и др.) Логические и побитовые операции (or, and, xor, shr и др.) Команды управления ходом выполнения программы (jmp, loop, ret и др.) Команды вызовапрерываний (иногда относят к командам управления):int Команды ввода/вывода в порты (in, out), Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:cjne— перейти, если не равно,djnz— декрементировать, и если результат ненулевой, то перейти,cfsneq— сравнить, и если не равно, пропустить следующую команду.Типичный формат записи команд:[метка:] мнемокод [операнды] [;комментарий]где мнемокод — непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.).В качестве операндов могут выступать константы, адреса регистров, адреса в оперативной памяти и пр. ДирективыПрограмма на языке ассемблера может содержать директивы: инструкции, не переводящиеся непосредственно в машинные команды, а управляющие работой компилятора. Набор и синтаксис их значительно разнятся и зависят не от аппаратной платформы, а от используемого транслятора (порождая диалекты языков в пределах одного семейства архитектур). В качестве «джентльменского набора» директив можно выделить следующие: определение данных (констант и переменных),управление организацией программы в памяти и параметрами выходного файла, задание режима работы компилятора, всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмыструктурного программирования),макросы.Для языка ассемблера предложения, составляющие программу, могут представлять собой синтаксические конструкции четырех типов. Команды (инструкции) представляют собой символические аналоги машинныхкоманд. В процессе трансляции инструкции ассемблера преобразуются в соответствующие команды системы команд процессора. Макрокоманды — это оформляемые определенным образом предложения текста программы, замещаемые во время трансляции другими предложениями.Директивы являются указанием транслятору ассемблера на выполнение некоторых действий. У директив нет аналогов в машинном представлении.Комментарии содержат любые символы, в том числе и буквы русского алфавита. Комментарии игнорируются транслятором.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]