Косвенная адресация
При косвенной адресации на операнд, находящийся в памяти, указывает содержимое регистра (или регистров). В инструкциях большинства МП, имя этого регистра указывается в скобках (круглых или квадратных), но иногда вместо этого перед именем регистра ставят символ *(обозначение в стиле языка С). Отметим, что адрес в регистре может быть как абсолютным, так и относительным, в зависимости от типа МП.
Косвенная адресация – это большой класс способов адресации включающий следующие разновидности:
Косвенная регистровая адресация. Здесь на адрес указывает только содержимое одного адресного регистра. Например, в МП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.
