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

15)Описать основные директивы определения данных и охарактеризовать их использование.

Соответственно, в языке ассемблера существует 5 (!) директив для определения данных:

  • DB (define byte) – определяет переменную размером в 1 байт;

  • DW (define word) – определяет переменную размеров в 2 байта (слово);

  • DD (define double word) – определяет переменную размером в 4 байта (двойное слово);

  • DQ (define quad word) – определяет переменную размером в 8 байт (учетверённое слово);

  • DT (define ten bytes) – определяет переменную размером в 10 байт.

Все директивы могут быть использованы как для объявления простых переменных, так и для объявления массивов. Хотя для определения строк, в принципе, можно использовать любую директиву, в связи с особенностями хранения данных в оперативной памяти лучше использовать директиву DB.

Синтаксис директив определения данных следующий:

<имя> DB <операнд> [, <операнд>]

Операнд задаёт начальное значение переменной. В качестве операнда может использоваться число, символ или знак вопроса, с помощью которого определяются неинициализированные переменные.

Выражение может содержать константу, например:

FLD1 DB 25

или знак вопроса для неопределенного значения, например

FLDB DB ?

16) Описать и объяснить формы инициализации программ типа .Exe.

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

EXE-программам. Для инициализации программы DOS предъявляет четыре требования:

1) указать ассемблеру, какие сегментные регистры должны соответствовать сегментам;

2) сохранить в стеке адрес, находящийся в регистре DS, в начале выполнения программы;

3) записать в стек нулевой адрес;

4) загрузить в регистр DS адрес сегмента данных.

Выход из программы и возврат в DOS сводится к использованию команды RET. Образец инициализации и выхода из программы:

CODESG SEGMENT PARA 'CODE' BEGIN PROC FAR

1. ASSUME CS:CODESG,DS:DATASG,SS:STACKG

2.

PUSH

DS

;Запись DS в стек

3.

XOR

AX,AX

;Установка нуля в AX

PUSH

AX

;Запись нуля в стек

4.

MOV

AX,DATASG

;Занесение адреса

MOV

DS,AX

; DATASG в DS

.

.

.

5.

RET

;Возврат в DOS

BEGIN

ENDP

CODESG

ENDS

END

BEGIN

Пояснения

(1) ASSUME – директива, которая устанавливает соответствие между конкретными сегментами и сегментными регистрами. В примере DATASG и STACKSG не определены;

обычно они представляются так:

STACKSG

SEGMENT

PARA

STACK Stack

'Stack'

DATASG

SEGMENT

PARA

'Data'

Ассоциируя сегменты с сегментными регистрами, ассемблер может определить смещения к отдельным областям в каждом сегменте. Так, каждая команда в сегменте кодов имеет определенную длину: первая команда имеет смещение 0, если это двухбайтовая команда, то вторая команда будет иметь смещение 2, и пр.

(2) Загрузочному модулю в памяти непосредственно предшествует 256-байтовая (шестнадцатеричное 100) область, называемая префиксом программного сегмента (ППС, PSP). Программа загрузчика использует регистр DS для установки адреса начальной точки ППС. Пользовательская программа должна сохранить этот адрес, поместив его в стек. Позже команда RET использует этот адрес для возврата в DOS.

(3) Система требует, чтобы следующее значение в стеке было нулевым адресом (точнее, смещением). Для этого команда XOR (или SUB) очищает регистр AX, а команда PUSH заносит это значение в стек.

(4) Загрузчик DOS устанавливает правильные адреса стека в регистре SS и сегмента кодов в регистре CS. Поскольку программа загрузчика использует регистр DS для своих целей,

нужно инициализировать регистр DS, как показано в примере.

(5) Команда RET обеспечивает выход из программы и возврат в DOS, используя адрес, записанный в стек в начале программы командой PUSH DS. Другим обычно используемым способом выхода служит команда INT 20H.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]