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