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

8.Процессор х86: прямая адресация и прямая со сдвигом.

Прямая адресация

При прямой адресации задается адрес операнда. Адрес операнда можно указывать в виде числовой константы или идентификатора переменной. Исполнительный адрес при этом помещается в текст программы. Использование числовых констант в качестве адресов практикуется только в реальном режиме, когда прикладной программе необходим доступ к системным областям памяти, расположенным в фиксированных адресах, например, области данных BIOS. В защищенном режиме такое просто невозможно. Во встроенном ассемблере к прямой адресации приводит обращение к глобальным переменным. Обращение к локальным переменным, несмотря на то, что внешне выглядит точно также, приводит к адресации по базе со сдвигом, так как они располагаются в стеке и доступ к ним осуществляется через регистр указатель базы EBP.

Пример прямой адресации:

int a;

short b;

char c;

……….

MOV ECX, a

MOV b, AX

MOV BL, c

MOV EDX, [0x250A12CD]

MOV EDI, SS:[0x00010A08]

Адресация со сдвигом (смещением)

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

Пример адресации со сдвигом:

int a;

struct S{

double x;

int i;

short j;

};

S s;

………

MOV EAX, s[8]

LEA EBX, s

MOV AX, [EBX][8+4]

LEA EDX, a

MOV CX, word ptr a[2]

MOV CL, byte ptr a[3]

9.Процессор х86: косвенная адресация и косвенная со сдвигом.

Адресация по базе (косвенная адресация)

Адресация по базе или косвенная адресация заключается в извлечении исполнительного адреса из регистра процессора. Если таким регистром является регистр EBP, то обращение производится к сегменту стека, во всех остальных случаях – к сегменту данных. Обычно косвенная адресация применяется при обращении к данным через указатели. При программировании на ассемблере часто используется операция загрузки исполнительного адреса LEA для последующего многократного обращения к объекту в памяти с использованием косвенной адресации.

Пример косвенной адресации:

int *pi, pj;

int a, b, m[100];

…….

pi=new int;

pj=&a;

…….

MOV EBX, pi

MOV ECX, pj

MOV EAX, [EBX]

MOV EDX, [ECX]

LEA EBX, b

MOV EAX, [EBX]

MOV EDI, 20*4

LEA EBX, m[EDI]

MOV EAX, [EBX]

Адресация со сдвигом (смещением)

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

Пример адресации со сдвигом:

int a;

struct S{

double x;

int i;

short j;

};

S s;

………

MOV EAX, s[8]

LEA EBX, s

MOV AX, [EBX][8+4]

LEA EDX, a

MOV CX, word ptr a[2]

MOV CL, byte ptr a[3]