Ассемблер имеет ряд операторов, которые управляют процессом ассемблирования и формированием листинга программ. Они действуют только в процессе ассемблирования и не генерируют никаких машинных кодов. Это псевдооператоры или директивы ассемблера. С их помощью определяют сегменты и процедуры, дают имена командам и данным, резервируют области памяти. Форматы и краткое описание некоторых из них приведены ниже.
2.4.1 Директивы (псевдооператоры) определения типа данных
Ассемблер определяет типы данных, используемых в команде, двумя способами: во-первых, через указание длины данных при их объявлении и, во-вторых, по их содержимому. Основной формат определения типа данных: [имя] Dn выражение
Имя данным присваивается, если в программе есть ссылки на эти данные. Тип переменной Dn, определяется следующими директивами:
DB – определить тип данных как байты (8 бит). Один байт выражается двумя десятичными или шестнадцатиричными цифрами.
Например, tabb db 23,45; строка из двух байт
hex db 35h,6Fh;
Prt db ‘Привет коллега!$; строка символов.
DW – определить тип данных как слово (два байта).
Например, tabw dw 1А23Н,45ЕВН; строка слов.
DD – определить тип данных как двойное слово ( четыре байта).
Например, tabd dd 45567785.
DF – определить тип данных как шестибайтовое поле.
Например, tabf df 455677858700.
DQ – определить тип данных как восьмибайтовое поле.
DT – определить тип данных как десятибайтовое поле.
DUP – директива повторения операнда.
Например, Т1 DB 9 DUP (06),15,47; Т1 – идентификатор,
DB–тип данных, 9–количество повторений числа 06.
Выражение может содержать константу или несколько констант, разделенных запятыми и ограниченных длиной строки.
Например, TABDB DB 45,32,78,09,55,39 ; ассемблер определяет в памяти эти константы как последовательность смежных байт. Ссылка по имени TABDB указывает на первую константу (45), по имени TABDB +1-на вторую (32) и т.д.
EQU и = эти директивы не определяют данные, а позволяют присвоить выражению символическое имя (идентификатор). Выражение может быть 16-битовой константой, ссылкой на адрес, символическим именем, меткой команды, операндом, символом. После присваивания имени выражению, можно использовать это имя всюду, где требуется указать это выражение.
Например, К EQU 1024; присвоить имя константе.
Tadr EQU DS:[BP] [SP]; присвоить имя комбинации адресов.
Count EQU CX; присвоить имя регистру.
К2 = 24; присвоить имя константе.
2.4.2 Директивы определения сегментов и процедур
Эти директивы отмечают начало и конец сегментов. Наболее распространенные директивы приведены в таблице 2.3.
Таблица 2.3- Директивы определения сегментов и процедур
SEGMENT ENDS PROC ENDP END ASSUME . DATA . CODE . STACK . MODEL | Формат: имя SEGMENT [тип]; определяет начало имя ENDS; и конец сегмента. Формат: имя PROC [атрибут дистанции; определяет начало имя ENDP; и конец некоторой процедуры. Формат: END [метка точки входа]; определяет конец программы. Формат: ASSUME сегм.рег.: имя сегмента; указывает с каким сегментом, связан указанный сегментный регистр. (пример: ASSUME cs: cseg, ds: dseg, ss: stack) Формат: .DATA [имя сегмента]; Задаёт начало и описывает сегмент данных в малой модели программы. Формат: .CODE [имя сегмента]; Задаёт начало и описывает сегмент кода в малой модели пограммы. Формат: .STACK [размер]; Задаёт начало и описывает сегмент стэка в малой модели программы. Формат: .MODEL [модель]; Позволяет определить модель памяти для программы. [модель] одна из следующих директив: TINY – код, данные и стэк в одном сегменте. · SMALL - код, данные и стэк в двух сегментах. · COMPACT – код в одном, а данные в N сегментах. · MEDIUM–код в N сегментах, данные в одном сегменте. |
Руководствуясь директивами, система выделяет области памяти под сегменты стека, данных, кода или процедуры. Руководствуясь этими директивами, операционная система определяет начальные адреса сегментов. Эти действия выполняются системой при трансляции программы.
Дата: 2018-11-18, просмотров: 825.