30.3.2. ADDRESS GENERATION UNIT



AGU (Address Generation Unit) служит для вычисления адрессов для
операндов находящихся в памяти.

Типичный Address Generation Unit:


При необходимости AGU выбирает из Register File регистры необходимые для вычисления адресса операнда. AGU имеет достаточно простую схему: несколько сумматоров и иногда сдвиговый регистр. Результат вычислений AGU передает BIU.


Режимы адресации





Режимы адрессации: o Прямая адресация o Косвенная адрессация Базовая Базовая со смещением (индексная) Базово-индексная Базово-индексная со смещением (Косвенно-индексная) Регистровая




Прямая адрессация



Адресс операнда содержится непосредственно в команде. AGU только передает его BIU напрямую. variable | V DIRECT(variable_address)


Косвенная адрессация (Абсолютная)




Непрямая адрессация (Базовая)



В поле операнда содержится номер регистра. Регистр выбирается из Register File и его содержимое является искомым адрессом. * variable_pointer | V BASE(register_contain_pointer)


Базовая адрессация со смещением (индексная)



В поле операнда содержится номер регистра. Регистр выбирается из Register File и его содержимое складывается со смещением (offset) которое берется из поля операнда. Результат и есть адресс. struct -> field | V BASE(struct_addr) + OFFSET(field)


Базово-индексная адрессация:



В поле операнда содержится 2 регистра. Регистры выбираются, и суммируются. array[index] | V BASE(array_addr) + INDEX(array_index)


Базово-индексная адрессация со смещением:



То же самое, что базово-индексная, но результат суммируется еще и со смещением. struct.array[index] | V BASE(struct) + OFFSET(field) + INDEX(array_index)


Базовая-индексная адрессация с маштабирование индекса и смещением:



Один из наиболее навороченных вариантов. Базовый регистр складывается с индексным регистром сдвинутым на некоторое число бит и к этому прибавляется смещение. Этим режимом адрессации очень удобно обращатся к массиву, который является элементом структуры. struct.field[array_index] | V BASE(struct) + OFFSET(field) + INDEX(array_index) * SCALE(array_element_size)


Специальные виды адрессации

Специальные виды адрессации / | \ Области быстрого стековая по указателю доступа память комманд Стековая память практически всегда специальный вид адрессации (он обеспечивает автоинкрементацию/автодекрементацию для указателя стека). В некоторых микропроцессорах этот вид адрессации может работать только со stack pointer регистром, в других с любыми регистрами общего назначения. Как правило инкремент/декремент автоматическим образом зависит от размера операнда.

stack | V BASE(stack_pointer); stack_pointer = stack_pointer + OPERAND_SIZE stack | V stackpointer = stack_pointer + OPERAND_SIZE BASE(stack_pointer)

stack | V BASE(stack_pointer) stack_pointer = stack_pointer - OPERAND_SIZE stack | V stack_pointer = stack_pointer - OPERAND_SIZE BASE(stack_pointer) Соответсвенно для выборки обратно инкремент/декремент и пост/пре меняются местами: --------------------------- Закладка Выборка в stack из stack --------------------------- [SP]++ --[SP] ++[SP] [SP]-- [SP]-- ++[SP] --[SP] [SP]++ ---------------------------


Адрессация по указателю комманд:



Когда мы выполняем комманду то регистр указатель комманды содержит указатель уже не на ту комманду которую мы выполняем, а на следующую за ней. В случае RISC процессоров с фиксированной длинной комманды это не представляет сложности, но в случае CISC для вычисления смещений надо учитывать еще и длинну текущей комманды. Пример ссылок назад: (желтая - наша команда, зеленое - место куда указывает IP, синее - место куда мы хотим обратиться с помощью адрессации по указателю комманд).

и вперед:


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


Index Prev Next