Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

00 Fldx db ? 01

01 Fldy dw ? 02

03 Fldz db ? 04

ORG $+5 09

Первая директива ORG возвращает адресный счетчик в нулевое значение.

Поля FLDX, FLDY и FLDZ определяют те же области памяти, что и поля FLDA,

FLDB и FLDC:

Смещение: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

| | | |

FLDA FLDB FLDC FLDD

| | |

FLDX FLDY FLDZ

Операнд, содержащий символ доллара ($), как во второй директиве ORG,

имеет текущее значение адресного счетчика. Таким образом, операнд $+5

устанавливает адресный счетчик равным 04 + 5 = 09, что представляет собой

то же значение, что и после определения поля FLDD.

Метка FLDC указывает на поле длиной в одно слово, находящееся по

смещению 03, а метка FLDZ указывает на однобайтовое поле по тому же

смещению:

MOV AX,FLOC ;Одно слово

MOV AL,FLDZ ;Oдин байт

Директиву ORG можно использовать для переопределения областей памяти.

При этом следует правильно устанавливать адресный счетчик и учитывать все

переопределяемые адреса памяти. Кроме того, новые переменные не должны

определять константы, так как при этом будут перекрыты константы,

определенные ранее. Директиву ORG нельзя использовать внутри определения

STRUCT.

Директива PROC

----------------

Любая процедура представляет собой совокупность кодов, начинающуюся

директивой PROC и завершающуюся директивой ENDP. Обычно эти директивы

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

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

использование команды CALL для вызова процедуры и RET для выхода из

процедуры.

Процедура, находящаяся в одном сегменте с вызывающей процедурой,

имеет тип NEAR:

имя-процедуры PROC [NEAR]

Если операнд опущен, то ассемблер принимает значение NEAR no умолчанию.

Если процедура является внешней по отношению к вызывающему сегменту, то ее

вызов может осуществляться только командой CALL, а сама процедура должна

быть объявлена как PUBLIC. Более того, если в вызываемой процедуре

используется другое значение ASSUME CS, то необходимо кодировать атрибут

FAR:

PUBLIC имя-процедуры,

имя-процедуры PROC FAR

При вызове любой процедуры с помощью команды CALL необходимо

обеспечить возврат по команде RET.

Директива PUBLIC

------------------

Назначение директивы PUBLIC - информировать ассемблер, что на указанные

имена имеются ссылки из других ассемблерных модулей. Формат директивы:

PUBLIC имя [,...]

Директива PUBLIC подробно описана в гл.21.

Директива RECORD

------------------

Директива RECORD позволяет определять битовые строки. Одно из

назначений этой директивы - определить однобитовые или многобитовые

переключатели. Формат директивы:

имя RECORD имя-поля:ширина [=выражение] [, ... ]

Имя директивы и имена полей могут быть любыми уникальными

идентификаторами. После каждого имени поля следует двоеточие (:) и размер

поля в битах, которое может быть от 1 до 16 бит:

Число определенных битов Принимаемый размер

1...8 8

9...16 16

Любой размер поля до 8 бит представляется восемью битами, а от 9 до

16 бит - представляется шестнадцатью битами, выровненными справа (если

необходимо). Рассмотрим следующую директиву RECORD:

BITREC RECORD BIT1:3,BIT2:7,BIT3:6

Имя BIT1 определяет первые 3 бит поля BITREC, BIT2 - следующие 7 бит и

BIT3 - последние 6 бит. Общее число битов - 16, т.е. одно слово. Можно

инициализировать поле BITREC, например, следующим образом:

BITREC2 RECORD BIT1:3=101B,BIT2:7=0110110B,BIT3:011010B

Предположим, что директива RECORD находится перед сегментом данных.

Тогда внутри сегмента данных должен быть другой оператор, который отводит

память под данные. Для этого необходимо определить уникальное имя, имя

директивы RECORD и операнд, состоящий из угловых скобок (символы меньше и

больше):

DEFBITS BITREC <>

Данное определение генерирует объектный код AD9A. который записывается как