Иллюстрированный самоучитель по теории операционных систем

Косвенно-регистровый режим

При реализации стека скалярных значений удобно использовать непрерывную область памяти в качестве массива, регистр 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) {
int t;
t=a;
a=b;
b=t;
}
;Для простоты мы не рассматриваем механизм передачи параметров
; и считаем, что они передаются в регистрах А и В
.GLOBL swap
swap:
POSH (A)
MOVE (B), (A)
POP (B)
RET.

Одно из основных назначений стека в регистровых архитектурах – это сохранение адреса возврата подпрограмм. Кроме того, если принятое в системе соглашение о вызовах подпрограмм предполагает, что вызываемая процедура должна сохранить все или некоторые регистры, которые использует сама, стек обычно применяют и для этого.

Неортогональные процессоры, такие, как х86, часто предоставляют специальные команды PUSH и POP, работающие с выделенным регистром SP (Stack Pointer), который не может быть использован для других целей.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.