Организация стека

SEL RB0

MOV R7, A

SEL RB0

MOV A, R0

MOV R7, A

SEL RB1

MOV A, R0

SEL RB0

Обычно основная работа программы происходит с банком RON0 и после сброса МК48 автоматически проходит команда SEL RB0, т.е. назначается банк RON0. Банк RON1 удобно использовать при наличии подпрограмм в программе. Если в основной программе и в подпрограмме используются одни и те же регистры R0…R7, то при переходе к подпрограмме удобно перейти к банку RON1, а в основной программе использовать банк RON0.

Например:

MOV R5, #26H

CALL PP1; команда перехода на подпрограмму с именем (меткой) PP1

; здесь и далее R5 из банка RON0=26H.

PP1: SEL RB1

MOV R5, #39H

; здесь и до команды выхода из подпрограммы R5 из банка RON1=39H

RET; выход из подпрограммы.

Регистры общего назначения R0…R7 обоих банков памяти данных – это прямо адресуемые регистры. Все остальные ячейки памяти данных не имеют имен, а имеют адреса. Как работать с такими ячейками? Считается, что именем ячейки является ее адрес. Адрес как видим 8-разрядное число 20H…3FH. Если бы была реализована прямая адресация, то команда MOV A,21H означала бы: содержимое ячейки с именем 21H (адресом 21H) переслать в аккумулятор, но эта возможность в данной системе команд не реализована. Чтобы выполнить эту операцию, используется команда

MOV A, @Ri, где i=0 или 1, т.е.может быть MOV A, @R0 или MOV A, @R1

Знак @ означает, что это не MOV A, R0 или MOV A, R1.

А где же в этой команде имя (адрес) ячейки 21H? Адрес ячейки необходимо предварительно поместить в R0 или R1, т.е.

MOV R0, #21H

MOV A, @R0

Это означает: содержимое ячейки с адресом 21H пересылается в аккумулятор.

MOV R1, #30H

MOV @R1, A означает: содержимое аккумулятора пересылается в ячейку памяти с адресом 30H.

В этих командах R0 и R1 – регистры косвенной адресации. Сочетания @R2…@R7 недопустимы. Косвенную адресацию можно применить к любой ячейке внутренней памяти данных.

Восьмиуровневый 16-ти разрядный стек с адресами от 08H до 17H адресуется указателем стека из PSW.

Указатель стека SP из регистра PSW Содержимое ячеек стека (приведено для ячеек 08H и 09H, для других – аналогично) Адрес ячейки стека
      16H
      14H
   
      0AH
  PSW (7…4) СК(11…8) 09H
СК(7…4) СК(3…0) 08H

В таблице PSW (7…4) – означает 4…7 разряды регистра PSW, СК (3…0) – 0…3 разряды счетчика команд СК и так далее.

Стек используется в следующих случаях:

А) при выполнении команд CALL addr – переход на подпрограмму, где addr- адрес начала подпрограммы. RET – возврат из подпрограммы.

При выполнении команды CALL addr содержимое счетчика команд (все 12 разрядов) запоминается в стеке по адресу, на который указывает указатель стека SP. Если SP=000, то идет заполнение 8 и 9 ячеек ОЗУ. Туда же заносятся 4…7 разряды регистра состояния программы (PSW). Далее SP увеличивается на единицу для новой записи в стек, т.е. по следующей команде CALL addr будут заполняться ячейки 10,11 ОЗУ, т.к. на них указывает указатель стека SP и так далее. По команде RET содержимое SP уменьшается на единицу и из ячеек ОЗУ, соответствующих полученному SP извлекается содержимое СК и четырех разрядов регистра PSW. Вывод: стек предназначен для временного хранения адресов возврата из подпрограмм, причем стек МК48 позволяет одновременно хранить 8 адресов возврата максимум. Это означает, что в программе не должно быть более 8 вложений подпрограмм друг в друга. Вложение одной подпрограммы в другую – это случай, когда осуществляется переход на подпрограмму В (условное имя) из области подпрограммы А (условное имя). Говорят, что стек МК48 имеет 8 уровней вложения. Рассмотрим пример использования стека с вложениями одной подпрограммы в другую.

1) …


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: