|
| ||
|
|
||
|
| ||
|
|
![]() | ![]() |
Косвенно-регистровый режим В этом режиме, как и в регистровом,
адресное поле не используется. Значение регистра интерпретируется как адрес операнда.
Данный режим используется для разыменования указателей или для обращения к памяти
по предварительно вычисленному адресу. Стек
Стек, или магазин — это
структура данных, над которой мы можем осуществлять две операции: проталкивание
(push) значения и выталкивание (pop). Значения выталкиваются из стека в порядке,
обратном тому, в котором проталкивались: LIFO (Last In, First Out, первый вошел,
последний вышел). Стековые структуры находят широкое применение при синтаксическом
разборе арифметических выражений и алголоподобных языков программирования [Кормен/Лейзерсон/Ривест
2000].
Рис. 2.7. Стек на основе массива
Рис. 2.8. Стеки, растущие вверх и вниз При реализации стека
скалярных значений удобно использовать непрерывную область памяти в качестве массива,
регистр SP в качестве указателя и режимы адресации с постинкрементом и предекрементом
при реализации команд проталкивания и выталкивания. MOVE x, -(SP) приведет к тому, что указатель стека уменьшится на размер х, и мы положим х в освободившуюся память. Напротив, команда MOVE (SP)+, у приведет к получению значения и продвижению указателя стека в обратном направлении. Поэтому первая команда имеет также мнемоническое обозначение PUSH х а вторая POP у Если мы поместим несколько значений в стек командой PUSH, команда POP вытолкнет их из стека в обратном порядке. Стек можно использовать для хранения промежуточных данных (см. пример 2.3) и при реализации арифметических выражений — например, команда ADD (SP)+, (SP) в точности воспроизводит описанную выше семантику безадресной команды ADD стековой архитектуры. Впрочем, безадресной команде ADD операнды не нужны, а в данном случае они просто не используются, но никуда не исчезают. Команда получается длиннее: у типичной стековой архитектуры команда сложения занимает 1 байт, у PDP-11 ее имитация занимает 2 байта, а у VAX — целых три. Поэтому, если мы хотим использовать стековую технику генерации кода, лучше использовать предназначенный для этого процессор. Пример 2.3. Использование стека для хранения промежуточных значений
void swap(int &a, int &b) { ;Для простоты мы не рассматриваем механизм передачи параметров Одно из
основных назначений стека в регистровых архитектурах — это сохранение адреса возврата
подпрограмм. Кроме того, если принятое в системе соглашение о вызовах подпрограмм
предполагает, что вызываемая процедура должна сохранить все или некоторые регистры,
которые использует сама, стек обычно применяют и для этого. |
![]() | ![]() |
|
|
||||||||
|
|
||||||||