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