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, синее - место куда мы хотим обратиться с помощью адрессации по указателю комманд).
и вперед:
Области быстрого доступа обычно используются во встроеных микропроцессорах. Доступ к ним осуществляется специальными командами которые содержат не полный прямой адресс, а только его часть (процессор жестко знает другую часть).