в) compact – используется один сегмент кодов и несколько сегментов данных, все переходы – типа NEAR, а обращение к данным – с указанием сегментного регистра, но сегменты данных и стека объединены в одну группу;

г) medium – несколько сегментов кодов и общий сегмент данных со стеком, доступ к процедурам – типа FAR, а обращение к данным указывает только смещение;

д) large – наиболее общий случай; несколько сегментов кодов и данных, вся адресация – с помощью сегментных регистров;

е) huge – аналогичен large, но предназначен для совмещения с программами на языках высокого уровня, разрешается работа с данными, занимающими >64КБ памяти.

Список значений параметра {тип} приведен не полностью, кроме того существуют другие параметры директивы. MODEL, но мы их здесь не рассматриваем.

При использовании данной директивы ИМ может иметь различную структуру.

Например,

. MODEL small

Stack 256

.Data

{данные}

.Code

ASSUME DS:@data, ES:@data

Main:

END Main

Создание файлов типа.EXE и.COM.

Для программы типа. EXE компоновщик автоматически генерирует определённый формат и при сохранении его на диске предворяет под программы специальным блоком размером ≥ 512 Б. Можно писать и выполнять программы типа. COM. Приимущество этих программ – меньший размер по сравнению с программами типа. EXE и более лёгкая адаптация к применению.

Существенные различия между программами типа. EXE и типа. COM включают в себя:

1)  Размер программы

Программы типа. COM используют единый сегмент для инструкций и данных, ограниченный размером 64 КБ включая префикс сегмента программы. PSP – это 256 Б(100h) блок, который загрузчик программ вставляет непосредственно перед программами при загрузке их в память диска. В. EXE есть ещё заголовок, который содержит информацию о перемещаемых адресах.

НЕ нашли? Не то? Что вы ищете?

2) Сегментация

Рассмотрим сегментную структуру файлов в памяти:

заголовок

PSP

Стек

Сег. данных

Сег. кода

EXE COM

PSP

Сегмент кода

Стек

ES

DS

ES CS

SS

CS

DS SS

Для программ типа. EXE необходимо явно определить сегменты данных и стека. Для программ типа. COM описание стека следует опустить.

2)  Инициализация

Когда загрузчик программ загружает для выполнения программу типа. COM он автоматически инициализирует CS, DS и ES адресом PSP. Поскольку PSP имеет размер 100h Б, то адресация программы начинается со смещения 100h, для чего требуется в текст программы внести директиву ORG 100h сразу за описанием сегмента. Эта директива приказывает ассемблеру установить счётчик положения в значения 100h – это адрес начала кода программы. Примеры программ, описанных в соответствии с требованиями формата. СОМ:

1) Title A05 COM

Codes Segment para ‘code’

ASSUME CS : codes, DS : codec, SS : codes, ES : codes

ORG 100h

BEGIN : JMP main

FLDD DW 215 ; определение данных

FLDE DW 125

FLDF DW?

main proc NEAR

…………………..

mov AX, 4C00h

int 21h

main endp

codes ends

end BEGIN ; программа для MASM и для. СОМ формата файла.

2) Title A05 COM2

.model TINY

.code

ORG 100h

BEGIN : JMP main

FLDD DW 215 ; определение данных

FLDE DW 125

FLDF DW ?

main proc NEAR

…………………..

main endp

end BEGIN.

Макросы

Каждая инструкция ЯА генерирует одну команду в машинных кодах. В языках высокого уровня одной инструкции (оператору) соответствует несколько машинных команд. С этой точки зрения языки высокого уровня можно рассматривать как набор макрокоманд. Ассемблер содержит механизмы, позволяющие создавать и использовать в программах макросы, вызываемые при помощи макрокоманд. Макрокоманды позволяют вставлять в текст программы последовательности строк (которые могут быть данными или командами) и привязывать их к контексту места вставки. В общем случае можно говорить, что транслятор ассемблера состоит из двух частей – непосредственно транслятора, формирующего ОМ, и макроассемблера.

Обработка программы на ЯА с использованием макросредств неявно осуществляется в 2 фазы :

Определение макросов

Макроопределение – это описание (шаблон, описание макроса) содержимого макрокоманды. Общий вид:

{имя макроса} MACRO [{список форм. аргументов}]

{тело макроса}

ENDM

где {имя макроса} – должно быть уникальным как в программе, так и в используемых библиотеках.

Для включения макросов в программу сначала их нужно определить или скопировать из библиотеки.

Возможны варианты размещения макроопределений:

- В начале ИМ до сегментов кодов и данных, если макроопределение используется только в данной программе;

- В отдельном файле (для нескольких программ); чтобы сделать доступными эти макросы в конкретной программе, нужно в начале ИМ записать директиву

INCLUDE {имя файла с макросом}

Например,

. MASM

.MODEL small

INCLUDE show. inc

Data segment

…………………….

- В макробиблиотеке (тоже файл типа. inc). Особенность – в исходный текст программы включаются все макросы из библиотеки. Чтобы бороться с этим нужно использовать директиву PURGE {список имен макросов}

Например,

INCLUDE iomac. inc

PURGE outstr, exit.

Простые определения макросов

Используются, например, для инициализации сегментных регистров в программе:

Например,

Initz MACRO

Mov AX, @data

Mov DS, AX

ENDM

причем INITZ – имя макроса, а AX, @data и DS должны быть определены где-то в вызывающей программе. Ассемблер обнаруживает в тексте программы имя макроса – это макровызов, например

Initz

Ассемблер вставляет на место макровызова тело макроса, создавая макрорасширение.

Например, для макроса

Finish MACRO

mov AX,4C00h

Int 21h

ENDM

программа до трансляции имеет вид

Title A21MAC

INITZ MACRO

mov AX, @data

mov DS, AX

ENDM

Finish MACRO

mov AX,4C00h

Int 21h

ENDM

.MODEL small

.Stack 64

.Data

Message DB ‘Test of macro?’,13,10,’$’

.code

begin PROC far

Initz ; вызов макроса для вывода строки

mov AH,09h ;

Lea DX, message ;

Int 21h

Finish

Begin ENDP

END begin.

Использование параметров в макросах

Чтобы сделать макрос модифицируемым, необходимо ввести формальные аргументы(ФА).

Например, для вывода на экран сообщений, составим следующий макрос:

Prompt MACRO Mess

MOV AH, 09h

LEA DX, Mess

INT 21h

ENDM

При обращении к макросу используются фактические аргументы. Например,

PROMPT Message2

и где-то в программе есть декларация

Message2 DB ‘Enter the date mm/dd/yy’,’$’

Тогда при формировании макрорасширения во все команды макроса подставляется Message2 вместо Message.

Полный синтаксис формального аргумента имеет вид

{имя ФА} [: {тип}]

где {тип} может принимать значения:

- REC – требуется обязательное задание ФА при макровызове (по умолчанию);

- =<{любая строка}> – если аргумент при макровызове на задан, то в соответствующие места макрорасширения будет вставлено значение по умолчанию, указанное в < >.

Не всегда ассемблер может распознать в теле макроса ФА. Для уверенности последовательность символов, образующих ФА, предваряется символом «&». Этот прием часто используется для задания модифицируемых имен и кодов операций.

Например, определим макрос генерации в программе некоторой таблицы, причем параметры этой таблицы можно задавать с помощью аргументов.

def_table MACRO Type=<b>, len

table_&type d&type len dup(0)

ENDM

. data

def_table b,10

def_table w,5

После трансляции получим

Table_b DB 10 dup(0)

Table_w DW 5 dup(0)

Комментарии в макросах

Т. к. по умолчанию в листинг после трансляции включаются только команды, генерирующие только объектный код ассемблера, не включающий в макрорасширение комментарии из макросов. Что бы комментарии попали в листинг существующей директивы управления листингом необходимо:

.LALL (List all) – вывести всё (помещается перед макровызовом), например:

.LALL

Promt Message1.

.XALL (по умолчанию) – подавляет комментарии в макрорасширениях. Если какой-то комментарий не должен попасть в макрорасширение при директиве. LALL, то перед ним ставят ;;

.SALL (Super all) – подавляет включение в листинг макрорасширений и позволяет уменьшить размер листинга, но не влияет на размер содержимого ОМ.

Директива управления листингом действует в программе пока в тексте программы не встретится директива LOCAL.

Некоторые программы включают в себя метки и переходы, но при многократном макровызове в одной программе может получится дублирование меток (ошибки), что бы создаваемые в макрорасширениях имена были уникальны, после директивы MACRO помещается директива LOCAL и {список имён}. Таких директив может быть несколько. В результате в каждом экземпляре макрорасширения сгенерируются уникальные имена для всех идентификаторов перечисленных в списке. Эти уникальные имена формируются автоматически и имеют вид??ХХХХ, где ХХХХ – 16-ричное представление числа, и тогда получаем

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11