Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
10.09.2019
Размер:
9.47 Mб
Скачать

Непосредственная адресация

Непосредственная адресация применяется, когда операнд, длинной в байт или слово находится в ассемблерной команде:

• MOV AH,4CH

Косвенная адресация

При использовании косвенной адресации абсолютный адрес формируется исходя из сегментного адреса в одном из сегментных регистров и смещения в регистрах BX, BP, SI или DI:

MOV

AL,[BX]

;База – в DS, смещение – в BX

MOV

AX,[BP]

;База – в SS, смещение – в BP

MOV

AX,ES:[SI]

;База – в ES, смещение – в SI

Базовая адресация

В случае применения базовой адресации исполнительный адрес является суммой значения смещения и содержимого регистра BP или BX, например:

MOV

AX,[BP+6]

;База – SS, смещение – BP+6

MOV

DX,8[BX]

;База – DS, смещение – BX+8

Индексная адресация

При индексной адресации исполнительный адрес определяется как сумма значения указанного смещения и содержимого регистра SI или DI так же, как и при базовой адресации, например:

• MOV

DX,[SI+5] ;База – DS, смещение – SI+5

Базово-индексная адресация

Базово-индексная адресация подразумевает использование для вычисления исполнительного адреса суммы содержимого базового регистра и индексного регистра, а также смещения, находящегося в операторе, например:

MOV

BX,[BP][SI]

;База – SS, смещение – BP+SI

MOV

ES:[BX+DI],AX ;База – ES, смещение – BX+DI

MOV

AX,[BP+6+DI]

;База – SS, смещение - BP+6+DI

//

#include<iostream.h>

int dddS,cccS,aaaS;

extern "C" {void

Lab3S(void);}

void F_C(void)

{

dddS=aaaS+cccS;

cout<<"c:";

cout<<" ddS="<<dddS<<endl;

}

void F_ASM(void)

{

Lab3S();

cout<<«ASM:";

cout<<" dddS="<<dddS<<endl;

}

void main(void)

{

cout<<"Input aaaS"; cin>>aaaS;

cout<<"Input cccS"; cin>>cccS;

F_C();

F_ASM();

}

.MODEL Large,C

.data

Extrn aaaS:byte,cccS:byte,dddS:byte

.code

Public Lab3S Lab3S proc far

mov al,aaaS add al,cccS mov dddS,al ret

Lab3S endp end

Организация программы

Сегменты

Программа состоит из одного или нескольких сегментов. Обычно область памяти, в которой находятся команды, называют сегментом кода, область памяти с данными — сегментом данных и область памяти, отведенную под стек, — сегментом стека. Ассемблер позволяет изменять устройство программы как угодно — помещать данные в сегмент кода, разносить код на множество сегментов, помещать стек в один сегмент с данными или вообще использовать один сегмент для всего.

Сегмент программы описывается директивами SEGMENT и ENDS.

имя_сегмента segment readonly выравн. тип разряд 'класс‘

………………………………………………….

...имя_сегмента ends

Имя сегмента — метка, которая будет использоваться для получения сегментного адреса, а также для комбинирования сегментов в группы.

Все пять операндов директивы SEGMENT необязательны.

READONLY. Если этот операнд присутствует, MASM выдаст сообщение об ошибке на все команды, выполняющие запись в данный сегмент. Другие ассемблеры этот операнд игнорируют.

Выравнивание. Указывает ассемблеру и компоновщику, с какого адреса может начинаться сегмент. Значения этого операнда:

BYTE — с любого адреса;

WORD — с четного адреса;

DWORD — с адреса, кратного 4;

PARA — с адреса, кратного 16 (граница параграфа);

PAGE — с адреса, кратного 256.

По умолчанию используется выравнивание по границе параграфа.

Тип. Выбирает один из возможных типов комбинирования сегментов:

тип PUBLIC (иногда используется синоним MEMORY) означает, что все такие сегменты с одинаковым именем, но разными классами будут объединены в один;

тип STACK — то же самое, что и PUBLIC, но должен использоваться для сегментов стека, потому что при загрузке программы сегмент, полученный объединением всех сегментов типа STACK, будет использоваться как стек;

сегменты типа COMMON с одинаковым именем также объединяются в один, но не последовательно, а по одному и тому же адресу, следовательно, длина суммарного сегмента будет равна не сумме длин объединяемых сегментов, как в случае PUBLIC и STACK, а длине максимального. Таким способом иногда можно формировать оверлейные программы;

тип AT — выражение указывает, что сегмент должен располагаться по фиксированному абсолютному адресу в памяти. Результат выражения, использующегося в качестве операнда для AT, равен этому адресу, деленному на 16. Например: segment at 40h — сегмент, начинающийся по абсолютному адресу 0400h. Такие сегменты обычно содержат только метки, указывающие на области памяти, которые могут потребоваться программе;

PRIVATE (значение по умолчанию) — сегмент такого типа не объединяется с другими сегментами.

Соседние файлы в папке Файлы преподавателя (наиболее достойные)