Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОД_МП.DOC
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Директива assume

Процессор использует регистр SS для вычисления физического адреса адресации вершины стека, регистр DS для адресации сегмента данных, регистр ES для адресации дополнительного сегмента данных и регистр CS для адресации сегмента кода. Ассемблеру необходимо сообщить назначение каждого сегмента. Для этого служит директива ASSUME, кодируемая в сегменте кода следующим образом:

Директива Операнд

ASSUME SS:им _ cтeк, DS:им _ дaн, CS:им _ кoд

Например, SS:им _ cтeк указывает, что ассемблер должен ассоциировать имя сегмента стека с регистром SS. Операнды могут записываться в любой последовательности. Регистр ES также может присутствовать среди операндов. Если программа не использует регистр ES, то его можно опустить или указать ES:NOTHING.

Директива END

Как уже показано, директива ENDS завершает сегмент, а директива ENDP завершает процедуру. Директива END в свою очередь полностью завершает всю программу:

Директива Операнд

END [имя _ процедуры]

Операнд может быть опущен, если программа не предназначена для выполнения, например если ассемблируются только определения данных, или эта программа должна быть скомпонована с другим (главным) модулем. Для обычной программы с одним модулем операнд содержит имя, указанное в директиве PROC, которое было обозначено как FAR.

1.4. Память и регистры

Рассмотрим особенности использования в командах имен, имен в квадратных скобках и чисел. В следующих примерах положим, что WORDA определяет слово в памяти:

MOV АХ,ВХ ; Переслать содержимое ВХ в регистр АХ.

MOV АХ,WORDA ; Переслать WORDA в регистр АХ.

MOV АХ,[ВХ] ; Переслать содержимое памяти по

; адресу в регистре ВХ, в регистр АХ.

MOV АХ,25 ; Переслать значение 25 в регистр АХ.

MOV АХ,[25] ; Переслать содержимое по смещению 25.

1.5. Инициализация программы

Существует два основных типа загрузочных программ: ЕХЕ и СОМ. Рассмотрим требования к ЕХЕ-программам. Для инициализации ассемблерной ЕХЕ-программы в системе DOS необходимо:

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

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

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

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

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

CODESG SEGMENT PARA ‘CODE’

BEGIN PROC FAR

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

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

XOR AX,AX ; Установить ноль в AX.

PUSH AX ; 3аписать ноль в стек.

MOV AX,DATASG ; Занести адрес.

MOV DS,AX ; DATASG в DS.

.

.

.

RET ; Возврат в DOS.

BEGIN ENDP

CODESG ENDS

END BEGIN

Рис. 1.1а. Инициализация ЕХЕ-программы

Иногда для выхода в DOS используют стандартное прерывание, которое поддерживается системой DOS. Это прерывание можно использовать в любой точки программы. При этом нет необходимости в записи в стек адреса возврата.

Программа выглядит следующим образом:

CODESG SEGMENT PARA ‘CODE’

BEGIN PROC FAR

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

MOV AX,DATASG ; Занести адрес.

MOV DS,AX ; DATASG в DS.

.

.

.

MOV AX,4C00H

INT 21H ; Возврат в DOS.

BEGIN ENDP

CODESG ENDS

END BEGIN

Рис. 1.1б. Инициализация ЕХЕ-программы

1. ASSUME – это ассемблерная директива, которая устанавливает для ассемблера соответствие между конкретными сегментами и сегментными регистрами. В данном случае CODESG соответствует CS, DATASG-DS и STACKSG-SS. Сегменты DATASG и STACKSG не определены в этом примере, но они могли быть представлены следующим образом:

STACKSG SEGMENT PARA STACK Stack ‘Stack’

DATASG SEGMENT PARA ‘Data’

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

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

3. В системе требуется, чтобы следующее значение в стеке являлось нулевым адресом, точнее, смещением. Для этого команда SUB очищает регистр АХ, вычитая его из этого же регистра АХ, а команда PUSH заносит это значение в стек.

4. Загрузчик DOS устанавливает правильные адреса стека в регистре SS и сегмента кодов в регистре CS. Поскольку программа загрузчика использует регистр DS для других целей, необходимо инициализировать регистр DS двумя командами MOV, как показано на рис. 1.1а и рис. 1.1б. В разделе 1.6. «Пример исходной программы» детально поясняется инициализация регистра DS.

5. Команда RET обеспечивает выход из пользовательской программы и возврат в DOS, используя для этого адрес, записанный в стек в начале программы командой PUSH DS. Другим, часто используемым способом завершения программы, является команда INT 21Н.

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