Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

 

74

mov word ptr [DI],0

; Записать ноль как слово по адресу указанному в

 

; регистре DI.

mov [DI], word ptr 0 ; Делает то же самое, что и предыдущий пример.

С помощью оператора PTR можно обращаться к отдельным байтам в многобайтовой переменной, пример:

.data

A dw 3612h ; Двухбайтовая переменная 3612h.

.code

...

mov ah, byte ptr A ; Пересылает первый байт (12h) в AH.

add ah, byte ptr A+1 ; Прибавляет второй байт (36h); в AH будет значение

;48h (12h+36h).

4.3.Способы адресации

Рассмотрев команды пересылки, мы можем рассмотреть все способы адресации операндов в командах на ассемблере.

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

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

Операнд указывается непосредственно в поле команды, например: mov ax,312 ; здесь 312 задается непосредственно

4.3.2. Регистровая адресация

Операнд находится в одном из регистров. Например, оба операнда в команде

mov ds,bx

задаются с помощью регистрового способа адресации.

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

Адрес операнда находится в одном из регистров — SI, DI, BX, BP. Например, команда

mov ax,[si]

помещает в регистр AX слово из ячейки памяти, смещение которой указано в регистре SI. Второй операнд задан с помощью косвенной адресации.

Следует отметить, что регистры SI, DI, BX, BP использовались до 80386 процессора, но в последующих поколениях процессоров для задания адреса операнда можно еще использовать регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP.

4.3.4. Прямая адресация (адресация по смещению)

Абсолютный адрес операнда можно задавать в виде СЕГМЕНТ:СМЕЩЕНИЕ, где СЕГМЕНТ — адрес сегмента на который указывает какой-либо сегментный регистр (CS, DS, SS или ES), а СМЕЩЕНИЕ — адрес операнда относительно сегментного регистра (относительный адрес).

Примеры:

mov ax,ss:0037h mov bx,es:var

http://www.sklyaroff.ru

75

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

Адрес операнда формируется сложением содержимого базового регистра (BP или BX) и смещения. Если смещение не задано, то предполагается нулевое значение.

Если используется BP, то адрес определенного операнда отсчитывается относительно сегмента, на который указывает регистр SS. Если используется BX, то адрес отсчитывается относительно сегмента, на который указывает регистр DS.

Например, команда:

mov ax,[bx+2]

помещает в регистр AX слово, которое находится в сегменте, указанном в DS, со смещением на два больше, чем число из BX.

Базовая адресация имеет множество альтернативных форм. Так, эквивалентными формами являются:

смещение[BP] [смещение][BP] [BP+смещение] [BP].смещение [BP]+смещение

В каждом случае адрес операнда равен сумме значений указанного смещения и содержимого заданного регистра.

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

Этот метод адресации подобен предыдущему, только адрес операнда формируется сложением содержимого индексного регистра (SI или DI) и смещения. Если смещение не задано, то предполагается нулевое значение.

В индексной адресации можно использовать множитель 1, 2, 4 или 8 чтобы прочитать элемент равный соответственно – байту, слову, двойному или учетверенному слову. Это называется масштабированием индексного регистра.

Примеры: mov ax,[si] mov ax,[di] mov ax,12[di]

mov ax,[esi*4]+2

Индексная адресация имеет множество альтернативных форм. Так, эквивалентными формами являются:

смещение[SI] [смещение][SI] [SI+смещение] [SI].смещение [SI]+смещение

В каждом случае адрес операнда равен сумме значений указанного смещения и содержимого заданного индексного регистра.

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

Адрес операнда формируется сложением содержимого базового регистра (BP или BX) и индексного регистра (SI или DI), и смещения, если оно указано.

Если используется регистр BP, то адрес отсчитывается относительно сегмента, на который указывает регистр SS. В ином случае этот адрес отсчитывается относительно сегмента, на который указывает регистр DS.

Примеры:

mov ax,[bp][si] mov ax,12[bp+di] mov ax,[bx][si+2]