Скачиваний:
106
Добавлен:
16.04.2013
Размер:
79 Кб
Скачать
☆

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

При косвенной адресации на операнд, находящийся в памяти, указывает содержимое регистра (или регистров). В инструкциях большинства МП, имя этого регистра указывается в скобках (круглых или квадратных), но иногда вместо этого перед именем регистра ставят символ * (обозначение в стиле языка С). Отметим, что адрес в регистре может быть как абсолютным, так и относительным, в зависимости от типа МП.

Косвенная адресация – это большой класс способов адресации включающий следующие разновидности:

  • Косвенная регистровая адресация. Здесь на адрес указывает только содержимое одного адресного регистра. Например, в МП MC68000, инструкция CLR.W (A3) очищает в памяти слово по адресу, на который указывает содержимое регистра A3.

  • Косвенная регистровая адресация с базой (называемая иногда просто базовой). Здесь в инструкции дополнительно указывается некоторое число, которое прибавляется к содержимому регистра при вычислении адреса операнда. Например, в МП ix86, инструкция MOV AH,6[BP] пересылает в регистр AH содержимое байта по адресу 6+(содержимое регистра BP).

  • Индексная адресация. Здесь адрес операнда задается не только косвенным регистром (с базой или без базы), но и индексным регистром, указывающим дополнительное смещение (индекс массива). Например, в МП DSP5600x, инструкция MOVE A0,X:(R1+N1) заносит содержимое регистра A0 в ячейку X-памяти по адресу определяемому суммой регистров R1 и N1.

  • Индексная адресация с масштабированием. Некоторые процессоры допускают, что индексный регистр может указывать не просто индексное смещение, а индекс элемента массива, в этом случае индексное смещение равно значению индексного регистра умноженного на размер элемента массива. Например, в МП ix86, инструкция MOVE AX, [DX+2000+ID*2] заносит в регистр AX слово памяти расположенное по адресу, равному сумме содержимого регистра DX, плюс 2000, плюс удвоенное содержимое регистра ID.

Кроме того, многие МП допускают косвенную адресацию с инкрементированием и декрементированием.

Инкрементирование и декрементирование

Инкрементирование – это автоматическое увеличение адресного регистра, используемого для вычисления адреса операнда, на некоторую наперед заданную величину. Декрементирование – это автоматическое уменьшение адресного регистра, используемого для вычисления адреса операнда, на некоторую наперед заданную величину.

Эта величина может быть константой (обычно единицей, либо определяется размером операнда), в этом случае ставят специальный значок «-» для декремента и «+» для инкремента. Например, в МП TMS320C54xx, инструкция ADD *AR2+,A запишет в аккумулятор содержимое ячейки памяти на которую указывает регистр AR2, а после этого содержимое регистра AR2 будет увеличено на 1.

Но иногда, величина, на которую изменяется адресный регистр задается в виде параметра находящегося в специальном, явно указанном регистре. Например, в МП TMS320C54xx, инструкция ADD *AR2+0,A запишет в аккумулятор содержимое ячейки памяти на которую указывает регистр AR2, а после этого содержимое регистра AR2 будет увеличено на содержимое регистра AR0.

Различают постинкрементирование (постдектрементирование) и преинкрементирование (предекрементирование). Приставка «пост» означает, что операция с адресным регистром выполняется после выполнения основной операции инструкции, а приставка «пре» означает, что операция с адресным регистром выполняется перед выполнением основной операции инструкции. Например, в МП MC6800 инструкция MOVE.L -(A3),(A4)+, перешлет 4-байтовое слово, но перед этой операцией из регистра А3 будет вычтено 4, а после операции пересылки в регистр А4 будет добавлено 4.

Отметим, что в некоторых МП существуют инструкции со сложной неявной косвенной адресацией. Например, в МП ix86, безоперандная инструкция MOVSW берет двухбайтное слово из области, начало которой задается базовым регистром DS, а смещение – в индексном регистре SI, и пересылает это слово в область, начало которой задается базовым регистром ES, а смещение – в индексном регистре DI. После выполнения пересылки значения регистров SI и DI синхронно постдекрементируются, либо постинкрементируются, в зависимости от значения специального флага DF расположенного в регистре флагов, причем значение инкремента/декремента равно 2.