Директивы языка ассемблера ASM-86
Для определения сегментов программы служат директивы SEGMENT, ENDS, ASSUME и ORG. Назначение первых трех директив было показано в приведенном примере программы. Директива ORG задает ассемблеру адрес ячейки памяти для первой команды транслируемой программы в сегменте CS. Например, фрагмент программы
code SEGMENT
ORG 0F3h
указывает ассемблеру, что результирующая программа должна быть расположена, начиная с адреса 0F3h относительно содержимого регистра СS. Начальное значение регистра CS в этом случае назначает сама программа-ассемблер. При необходимости можно указать конкретный физический адрес начала программы путем использования вспомогательного оператора АТ. Например, фрагмент
code SEGMENT АТ 0А000h
ORG 0F3h
задает начальный адрес первой команды программы, равный 0А00FЗh.
Для определения типов переменных и резервирования памяти служат директивы DB, DW, DD, DQ и DT, которые определяют байт, слово, двойное слово, восемь байт и десять байт, соответственно. Например, совокупность операторов
alpha DB ?
beta DW 0F200h
gamma DD ?
резервирует байт памяти для переменной alpha, 4 байта - для переменной gamma и 2 байта - для переменной beta, причем переменной beta присваивается начальное значение 0F200h. Эти директивы могут задавать также и массивы переменных, например операторы
mas DB 5h, 0Аh, 13h
zero DB 0,0,0,0,0,0
res DW ?,?,?,?
определяют массив mas, включающий три константы 5h, 0АН и 13Н; массив zero, состоящий из шести байтов с нулевыми начальными значениями, и массив res, включающий четыре слова, для которых начальные значения не заданы. В тех случаях, когда требуется задать массив, состоящий из большого числа переменных, используется вспомогательный оператор DUP. Например, оператор
zeros DB 100 DUP (0)
задает массив zeros из 100 байт с нулевыми начальными значениями, а оператор
result DW 200 DUP (?)
резервирует 200 слов памяти под массив result.
При использовании команд АМ возникает необходимость описывать данные размерностью 4, 8 и 10 байт соответственно для форматов КВФ, ДВФ и ВВФ. Для этой цели в языке ASM-86 введены директивы: DD, DQ и . DT, которые позволяют просто присваивать имена, а также резервировать соответствующее число байтов памяти без присвоения и с присвоением начальных значений. Для определения имен переменных или меток используются директивы EQU и PURGE. Например, в рассмотренной выше программе директива EQU ставила в соответствие имени порта port1 значение 110h. С помощью директивы EQU можно в любом месте программы вводить новые имена, например после включения оператора
port2 ЕQU port1
имена port2 и port1 будут восприниматься программой-ассемблером как эквивалентные. После включения оператора Count EQU СХ имя Count будет эквивалентно имени СХ, которое зарезервировано для обозначения регистра общего назначения ЦП. При использовании директивы EQU в поле операнда можно помещать различные выражения, например
sum2 EQU sum1 + 2
cycle EQU return – 5.
Директива EDU переименовывает переменные, но не отменяет их старых имен, т. е. после этой директивы можно обращаться к переменной по любому имени. Для отмены старого имени переменной используется директива PURGE, например, после включения в программу оператора
PURGE port1
использование имени port1 недопустимо.
Для организации процедур применяются директивы PROC и ENDP. Например, процедура myproc увеличивает значение cx на 10:
myproc PROC
add cx,10
ret
myproc ENDP.
Очень часто в ассемблерных программах используются директивы, позволяющие вводить макроопределения. Например, макроопределение с именем mov_string и формальными параметрами dest, src и len.
mov_string MACRO dest,src,len
mov cx,len
lea si,src
lea di,dest
rep movsb
ENDM
Это макроопределение позволит использовать в программе новую «команду» с мнемокодом mov_string и тремя операндами, которые при вызове станут фактическими параметрами. Так вызов макроопределения:
mov_string addrD,addrS,100
осуществит пересылку 100 байтов из адреса addrS по адресу addrD.
Наряду с мнемокодами команд процессора ЦП язык ASM-86 допускает использование мнемокодов команд арифметического процессора. Особенность программы-ассемблера при обработке команд АП заключается в том, что она автоматически вводит в результирующую программу код команды WAIT перед командами АП, которая необходима для синхронизации работы процессоров. Это освобождает составителя программ от необходимости записывать мнемокод WAIT перед каждой командой для АП.
Как было показано, все мнемокоды команд АП начинаются с буквы F, что облегчает отличать их от мнемокодов команд ЦП. Для команд сопроцессора FNCLEX, FNDISI, ENENI, FNINIT, FNOP, FNSAVE, FNSTCW, FNSTSW не требуется наличия перед ними команды WAIT, поэтому мнемокод этих команд снабжается дополнительной буквой N, что также облегчает работу программы-ассемблера.
В качестве примера рассмотрим фрагмент программы на ассемблере, использующий мнемокоды обоих процессоров:
fcomp
fnstsw flags1
mov ah,flags1
sahf
jz ...
Этот фрагмент показывает, как реализуется условный переход по результатам сравнения чисел с плавающей запятой. Поскольку в системе команд АП отсутствуют команды условных переходов, то используется следующий прием. После выполнения команды сравнения (fcomp) результаты сравнения (старший байт регистра состояния) запоминаются в памяти по адресу flags1. Затем они пересылаются в старший байт аккумулятора ah центрального процессора и запоминаются в регистре флагов F по команде sahf. Разряды С0,СЗ регистра состояния АП соответствуют разрядам регистра F, в которых размещены значения флагов CF и ZF, поэтому можно воспользоваться любой из команд условных переходов.
Дата добавления: 2018-11-26; просмотров: 870;