Косвенная адресация
При косвенной адресации величина смещения не задается, а рассчитывается тем или иным образом.
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.