- •Assembler.
- •Организация выполняемых программ в ms – dos.
- •Система команд процессора Intel 86.
- •Директивы ассемблера
- •Основные группы команд.
- •Использование процедур в ассемблере.
- •Режим адресации в памяти и микропроцессоре Intel 86.
- •Определение физического адреса.
- •Связь ассемблера с языками высокого уровня
Система команд процессора Intel 86.
Формат:
Префикс |
перераспределение сегмента |
КОП |
режим адресации |
Данные |
Адрес |
0/1 байт |
0/1 байт |
Всегда 1 байт |
0/1 байт |
0/1/2 байт |
0/1/2 байт |
Есть всегда! Взаимоисключаемые
Максимальная длина команды = 6 байт.
Префикс используется для:
задания, выполнения, повторения данной команды (обычно для строк);
запрещает доступ к … на время выполнения команды (LOCK);
Переопределение сегментов – изменение сегмента, принятого поумолчанию.
Режим адресации – указание: с регистром или с памятью мы будем работать.
Директивы ассемблера
1. Директивы задания данных
Директива определения имен
a) имя EQU выражение
Например
N EQU 100h
TABLE EQU DS:[BP][SI]
MINS_DAY EQU 60*24
b) имя = выражение
Это имя может переопределяться и использоваться только для числовых выражений.
Директива выделения памяти
идентификатор D* список значений
где D* ода из приведенный ниже псевдокоманд:
DB- определить байт;
DW- определить слово;
DD- определить двойное слово;
DQ- определить учетверенное слово;
DT- определить десять байт;
DF- определить шесть байт.
Данная директива позволяет зарезервировать в памяти указанную область и приписать или не приписывать ей определенного значения. Например
text_string db ‘Hello world’
b_max db 255
b_min db -128
rez_w dw ?
rez_tab dw 20dup(?)
b_tab db 4dup(?),8,5,4dup(1)
fl_num dd 5.03E-2
2. Директивы сегментации программы
Два способа задания сегментов в программе.
2.1. Полное описание сегментов
2.1.1. Определение сегмента
имя_сегмента SEGMENT атрибуты
тело сегмента
имя_сегмента ENDS
Пример
dat_s1 segment byte public ‘data’
a db ?
dat_s1 ends
Атрибуты:
ReadOnly- сегмент доступен только для чтения; при попытки записи в этот сегмент MASM выдаст сообщение об ошибке.
Атрибут выравнивания- указывает ассемблеру и компоновщику, с какого адреса может начинаться сегмент.
BYTE- с любого адреса.
WORD- с четного адреса.
DWORD- с адреса, кратного 4.
PARA- с адреса, кратного 16 (установлен по умолчанию).
PAGE- с адреса, кратного 256.
Атрибут группирования, комбинирования.
PUBLIC- конкатенация (присоединение частей сегментов друг к другу).
COMMON- размещение сегментов данного класса с одного адреса (для сегментов кода и оверлейных программ).
PRIVATE- сегмент с таким атрибутом не объединяется с другими сегментами (значение по умолчанию).
Атрибут типа данных.
USE16- сегмент работает с 16 битными данными.
USE32- сегмент работает с 32 битными данными.
Атрибут класса- это любая метка, взятая в одинарные кавычки. Этот атрибут влияет на расположение сегментов в скомпонованной программе.
2.1.2. Связь сегментов с соответствующими сегментными регистрами.
ASSUME {регистр_сегментный: имя_сегмента,…}
Обычно эта директива идет вслед за сегментом кода.
Пример
assume cs: code_s, ds: d_seg,
ss: stack, es: nothing
NOTHING- не устанавливать связь или отменить ее, если она была установлена.
2.1.3.Загрузка начальных адресов сегментов в соответствующие регистры.
mov ax, seg d_seg ; seg- не обязательный оператор
mov ds, ax
2.2. Сокращенное описание сегментов.
При таком описании требуется обязательное задание модели памяти, в условиях которой используется данная программа.
.MODEL тип_модели_памяти
Эта директива накладывает ограничения на комбинирование сегментов
Модель |
Тип доступа к коду |
Тип доступа к данным |
Сегментные регистры |
Примечания |
TINY |
Near |
Near |
(cs)=DGroup (ds)=(ss)=DGroup |
.com |
SMALL |
Near |
Near |
(cs)=_Text (ds)=(ss)=DGroup |
.exe |
MEDIUM |
Far |
Near |
(cs)=<имя_сегмента>_Text (ds)=(ss)=DGroup |
|
LARGE |
Far |
Far |
(cs)=<имя_сегмента>_Text (ds)=(ss)=DGroup |
|
HUGE |
Far |
Far |
|
|
.CODE- директива описания сегмента кода; эта запись аналогична
_TEXT SEGMENT Word Public ‘CODE’
или
<имя_сегмента> _TEXT Word Public ‘CODE’
для модели памяти выше MEDIUM
.DATA
_DATA SEGMENT Word Public ‘DATA’
.STACK
STACK SEGMENT Para Public ‘STACK’
.CONST
CONST SEGMENT Word Public ‘CONST’
.DATA?
_BSS SEGMENT Word Public ‘BBS’
Отличие от полного описания сегментов заключается в отсутствии директивы ENDS. Таким образом, в результате создаются предопределенные переменные, которые содержат начальные адреса сегментов: @Code, @Data, @Stack, @Const, @BBS. Следовательно можно написать:
mov ax, @data
mov ds, ax
3. Директивы группирования.
GROUP имя_сегмента1, имя_сегмента2,…
Все перечисленные сегменты относятся к одной группе и могут адресоваться относительно одного регистра (обычно в одну группу объединяют сегменты одного назначения, например, data и stack).
4. Порядок размещения сегментов.
Он важен для того, чтобы уметь определять длину программы и для возможности работы в отладочном режиме. Обычно компоновщик размещает сегменты в порядке их появления в программе, заданном в главном модуле; для подтверждения такого размещения можно написать:
.SEQ
для размещения в алфавитном порядке:
.ALPHA
размещение сегментов в порядке, принятом в MS DOS:
.DOSSEG
Эти директивы должны располагаться в самом начале программы.
Порядок размещения сегментов, соответствующий .DOSSEG:
‘CODE’
сегменты не относящиеся к DGROUP (FAR DATE, FAR STACK)
сегменты DGROUP (‘DATE’, ‘STACK’, ‘BSS’, ‘CONST’)
5. Директивы ограничения используемых команд.
По умолчанию используется набор команд процессора i8086 (при попытке исполнить какую либо другую, возникает прерывание). Директивы, определяющие набор допустимых команд:
.ix86 (где x=1,2..6) позволяет использовать команды соответствующих процессоров;
.MXX- возможность применения команд мультимедиа расширения;
.K3D- разрешены команды AMD 3D
6. Директива END.
END [метка старта]- логический конец программы, далее транслятор текст не просматривает. Метка старта- адрес, с которого начинается выполнение программы.
Операции и выражения в ассемблере.
1. Арифметические операции.
+, -, *, /, mod (эти операции выполняются на этапе трансляции)
pi_int EQU 31416/1000 - целая часть
pi_rem EQU 31416 mod 1000 - дробная часть
SHR_N - сдвиговые операции (вправо и влево на N двоичных разрядов.
SHL_R
maska EQU 110010b
maska2 EQU maska SHR_2
2. Логические операции.
Эти операции подразделяются на операции отношения (EQ, NE, LT, LE, GT,GE) и на непосредственно логические (AND, OR, XOR, NOT).
Истина — 0FFFFh
Ложь — 0
mov ax, ((b LT 10) AND 5) OR ((b GE 10) AND 15)
при b=3 предыдущая команда означает: mov ax, 5.
3. Операции со счетчиком размещения программы (СРП).
LC- Location Counter
$- текущее значение СРП, предопределенная переменная.
Message DB ‘Hello!!!’
Mes_leght=$-Message
ORG- директива принудительной установки СРП на константу.
ORG 100h – для *.com
ORG $+99h – изменение СРП на 99 байт по отношению к текущему значению.
EVEN- задает четное значение СРП (выравнивает СРП на ближайшее четное большее текущего).
4. Оператор изменения типа.
<тип> PTR переменная или метка.
B_TABLE DB 40DUP
mov ax, B_TABLE+10
mov ax, word ptr B_TABLE+10
x_word EQU 0FFFCh
xor ax, ax
add al, byte ptr xword ; (AL)=FCh
CALL FAR PTR My_Sub
5. Операции выделения сегментной части адреса и смещения.
SEG - переменная (DS)
OFFSET - метка (СS)
SIZE имя переменной - определяет размер переменной в байтах.