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

При косвенной адресации величина смещения не задается, а рассчитывается тем или иным образом.

2.1. Косвенная регистровая (базовая) адресация

Смещение операнда находится в одном из регистров BX, SI, DI или BP. Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки «[ ]».

Например, запись в регистр AX слова, которое берется из памяти по эффективному адресу (смещению), находящемуся в регистре BX:

 

MOV AX,[BX]

 

Физический адрес первого байта слова равен .

Например, запись в регистр DH байта, который берется из памяти по эффективному адресу (смещению), находящемуся в регистре SI:

 

MOV DH,[SI]

 

Физический адрес байта равен .

Как и в случае прямой адресации, сегментный регистр DS используется при определении физического адреса по умолчанию, но не во всех случаях: если смещение берут из регистров SP или BP (при работе со стеком), то в качестве сегментного регистра используется регистр SS.

2.2. Косвенная регистровая (базовая) адресация со смещением

Смещение операнда определяется как сумма значения находящегося в одном из регистров BX, SI, DI или BP и дополнительного 8- или 16-разрядного смещения, в качестве которого можно указать число или адрес метки.

Например

 

ADD AX,[BX+2]

MOV DH,array1[SI]

 

В последнем примере в регистр DH будет записан байт из памяти, эффективный адрес которого определяется суммой значения регистра SI и эффективного адреса идентификатора array1.

2.3. Косвенная базовая индексная адресация

При этом виде адресации эффективный адрес (смещение) формируется как сумма содержимого двух регистров общего назначения: базового и индексного.

Например

 

ADD AX,[BX+DI]

MOV DH, [BX+SI*2]

 

2.4. Косвенная базовая индексная адресация со смещением

Этот вид адресации является дополнением косвенной индексной адресации. Эффективный адрес формируется как сумма трех составляющих: содержимого базового регистра, содержимого индексного регистра и значения поля смещения в команде, в качестве которого можно указать число или адрес метки. К примеру, команда MOV AH,[SI+5+DX] пересылает в регистр AH байт по физическому адресу: .

 

Вопросы для самопроверки

1. Какие из следующих идентификаторов неправильны и почему?

1.1. RES;

1.2. AH;

1.3. 5ERH;

1.4. DE.F

2. В чем различие между командой и директивой?

3. Какие символы могут содержаться в комментариях?

4. Является ли конструкция B5H правильной шестнадцатеричной константой?

5. Есть ли разница между идентификаторами perem и PEREM в программе на языке ассемблера?

6. В чем разница между константами '7' и 7D?

7. Какое из чисел больше 10В, 10D или 10H?

8. Выполните арифметическую операцию: 11001B+2FH.