1.4 Регистровый косвенный (базовый и индексный).
Адресуется память (байт или слово). Относительный адрес ячейки памяти находится в регистре, обозначение которого заключается в прямые скобки. В МП 86 косвенная адресация допустима только через регистры ВХ, ВР, SI и DI. При использовании регистров ВХ или ВР адресацию называют базовой, при использовании регистров SI или DI - индексной.
Если косвенная адресация осуществляется через один из регистров ВХ, SI или DI, то подразумевается сегмент, адресуемый через DS, поэтому при адресации через этот регистр обозначение DS: можно опустить:
mov es: [bx],'1' ――――→ mov [bx],'1'
Кстати, этот фрагмент немного эффективнее предыдущего в смысле расходования памяти. Из-за отсутствия в коде последней команды префикса замены сегмента он занимает на 1 байт меньше места.
Регистры ВХ, SI и DI в данном применении совершенно равнозначны, и с одинаковым успехом можно воспользоваться любым из них:
Не так обстоит дело с регистром ВР. Этот регистр специально предназначен для работы со стеком, и при адресации через этот регистр в режимах косвенной адресации подразумевается сегмент стека; другими словами, в качестве сегментного регистра по умолчанию используется регистр SS.
Обычно косвенная адресация к стеку используется в тех случаях, когда необходимо обратиться к данным, содержащимся в стеке, без изъятия их оттуда (например, если к эти данные приходится считывать неоднократно).
Обозначение этого способа адресации:
[BX] | (подразумевается DS: [BX]) |
[BP] | (подразумевается SS: [BP]) |
[SI] | (подразумевается DS: [SI]) |
[DI] | (подразумевается DS: [DI]) |
Использование базовой адресации, на первый взгляд, снижает эффективность программы, так как требует дополнительной операции - загрузки в базовый регистр требуемого адреса. Однако команда с базовой адресацией занимает меньше места в памяти (так как в нее не входит адрес ячейки) и выполняется быстрее команды с прямой адресацией (из-за того, что команда короче, процессору требуется меньше времени на ее считывание из памяти). Поэтому базовая адресация эффективна в тех случаях, когда по заданному адресу приходится обращаться многократно, особенно, в цикле. Выигрыш оказывается тем больше, чем большее число, раз происходит обращение по указанному адресу. С другой стороны, возможности этого режима адресации невелики, и на практике чаще используют более сложные способы.
Примеры:
mov SI, offset string | ; В SI загружается относительный адрес ячейки string |
mov AX, [SI] | ; Содержимое ячейки string загружается в AX |
inc [SI] | ; Увеличиваться содержимое ячейки string |
mov BX, [SI] | ; Новое содержимое ячейки string загружается в BX |
mov DI, SI | ; Относительный адрес ячейки string копируется в DI |
1.5 Регистровый косвенный режим со смещением (базовый и индексный).
Адресуется память (байт или слово). Относительный адрес операнда определяется, как сумма содержимого регистра BX, BP, SI или DI и указанной в команде константы, иногда называемой смещением. Смещение может быть числом или адресом. Так же, как и в случае базовой адресации, при использовании регистров BX, SI и DI подразумевается сегмент, адресуемый через DS, а при использовании ВР подразумевается сегмент стека и, соответственно, регистр SS.
смещение = {SP, BP, DI, SI, BX} + смещение из команды
Иногда можно встретиться с альтернативными обозначениями того же способа адресации, которые допускает ассемблер. Вместо, например, 4 [ВХ] можно с таким же успехом написать [ВХ+4], 4+ [ВХ] или [ВХ] +4. Такая неоднозначность языка ничего, кроме путаницы, не приносит, однако ее надо иметь в виду, так как с этими обозначениями можно столкнуться, например, рассматривая текст деассемблированной программы.
Рассмотрим теперь пример использования базовой адресации со смещением при обращении к стеку:
смещение = {SP, BP, DI, SI, BX} + смещение из команды
Здесь квадратные скобки [] - это тоже оператор. Он вычисляет адрес как сумму того, что находится внутри скобок с тем, что находится снаружи.
array db 0, 10, 20, 30, 40, 50, 60; Пусть в сегменте данных определен массив:
Последовательность команд:
mov BX,5
mov AL,array [5] ; загрузит в AL элемент массива с индексом 5, то есть 50.
Тот же результат будет получен и в таких последовательностях команд:
mov BX,offset array
mov AL,5 [BX]
или
mov AL, [BX] +5
mov AL, [BX+5]
0 комментариев