Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Постановка задачи




Введение

Механизм подпрограмм

 

Используются два механизма вызова подпрограмм:

- статический (с использованием команды CALL #adr)

- динамический (с использованием команды INT #N)

 

Сначала, в этом разделе, рассмотрим более простой механизм "статического вызова".

Прежде чем разбираться с алгоритмами команд CALL #adr (вызвать подпрограмму), и RET (вернуться в программу) давайте уточним: а что вообще нужно выполнить, какие действия, чтобы "грамотно" перейти к выполнению подпрограммы и затем "грамотно" вернуться обратно? Скажем так: поставим задачу.

 

На рисунке отображён участок ОЗУ, отмечены области занимаемые программой и подпрограммой, выделены команды играющие роль в процессе вызова и последующего возврата:

 

 

В программе CALL #Adr – команда вызова перехода

Где #Adr – адрес подпрограммы, заданный методом непосредственной адресации

 

K2 – команда в программе, непосредственно следующая за командой CALL.

 

AB – адрес возврата, или адрес команды в программе следующей за CALL.

 

K1 – первая команда подпрограммы

 

Adr – адрес подпрограммы, который ещё называют "адрес вызова" или "адрес перехода".

 

RET – команда возврата из подпрограммы

 

 

Теперь рассмотрим – какие действия необходимы при вызове и возврате.

 

 

1) При вызове будет необходимо перейти от выполнения команды CALL, к выполнению команды К1 (показано стрелкой). Делаем вывод: алгоритм команды CALL должен предусматривать загрузку в программный счётчик адреса подпрограммы adr.

 

 

2) При возврате по команде RET необходимо перейти к выполнению, нет, только не той же команды с которой мы ушли из подпрограммы (так мы получим бесконечный цикл) – к выполнению команды сразу следующей в программе за командой CALL. Её адрес – "адрес возврата" нужно будет загружать в программный счётчик (PC) в ходе выполнения RET.

Откуда команда RET – "узнает" каков он, "адрес возврата"? Очень просто: ещё в ходе выполнения команды CALL по команде CALL процессор должен будет:

А) Вычислить адрес возврата;

Б) Запомнить его в системном стеке.

Тогда в ходе выполнения команды RET, по команде RET процессор просто прочитает адрес возврата из системного стека и - запишет его в программный счётчик.

 

Ещё не всё. Когда мы возвращаемся из подпрограммы - мы должны застать процессор в том же состоянии, в том же режиме работы каков был на момент вызова подпрограммы. Говорят "должны восстановить состояние процессора". Мы уже учили ранее – режим работы процессора определяет специальный регистр RF (регистр флагов). Смотрите [3.8] Поэтому команда CALL должна будет "запомнить состояние процессора", а именно – сохранить старое значение регистра RF в системном стеке, тогда команда RET сможет "восстановить старое значение регистра RF" – прочитать старое значение из регистра и занести его в RF.

 

Что интересно: сейчас вы уже знаете всё необходимое - чтоб самостоятельно написать алгоритмы команд и CALL #adr, и RET. Постановка задачи, необходимые специфические действия – описаны в этом разделе. В разделе [3.6.2] мы рассмотрели общие "стандартные" микрооперации. Там же рассмотрено – как вычисляется адрес следующей команды.

Нам потребуется работа с системным стеком? Какими микрооперациями обеспечивается запись и чтение в системный стек – мы также рассматривали в разделах [3.10.3], [3.10.4]. Видимо - эти же микрооперации потребуются и в ходе выполнения CALL и RET для того чтобы сохранить/восстановить адрес возврата и RF.

Попробуйте написать самостоятельно не заглядывая на следующую страницу курса.. Это для Вас – как очень полезное упражнение и маленький тест. Если вы сможете правильно написать алгоритмы (без подсказок) вы уже во многом разобрались как работает процессор и успешно осваиваете курс.

 


 

3.11.3 Алгоритм CALL #Adr

Проверьте Вашу работу. Вот алгоритм CALL #Adr:

 

  RC ß [PC]
  Дешифрация
  [SP] ß RF
  SP ß SP + LR
  PC ß PC + LK
  [SP] ß PC
  SP ß SP + LR
  PC ß #Adr

 

 

Микрооперации 1, 2: стандартные. См [3.6.2]

 

Микрооперации 3, 4: Сохраняем RF в стеке. Смотрите, те же действия что были описаны в разделе [3.10.3] "Алгоритм команды PUSH" микрооперации 3, 4 этого алгоритма.

 

Микрооперация 5: Наращиваем счетчик вершины стека - на величину длинны команды CALL. Вычисляем адрес возврата. После выполнения микрооперации – адрес возврата в программном счётчике. Смотрите [3.6.2]

 

Микрооперация 6: Заносим, теперь уже адрес возврата в системный стек. Опять - те же действия что были описаны в разделе [3.10.3] "Алгоритм команды PUSH" микрооперации 3, 4 этого алгоритма.

 

На этом – подготовка к переходу окончена, теперь:

 

Микрооперация 7: Собственно переход. Адрес перехода из поля атрибута команды заносится в PC. Теперь следующей выполняемая командой окажется первая команда подпрограммы.


Примечания:

 

1) Не было ошибкой если Вы самостоятельно написав этот алгоритм - сначала вычислили и сохранили в системном стеке адрес возврата, и лишь затем сохраняли RF. Порядок не важен. Одни процессоры могут сохранять в одном порядке, другие – в другом. Важно только чтоб команда RET читала сохранённые в стеке регистры в порядке - обратном порядку сохранения.

2) при вызове команды CALL не производится стандартная микрооперация проверка INT. Оно и понятно: появление INT означает запрос от внешнего устройства на переход к другой программе "программе обработке внешнего события" или "программе обработки прерывания". Было бы странным - только начав один переход тут же затевать и второй. Это только привело бы к путанице данных размещённых в системном стеке. Вот поэтому процессор при выполнении команды перехода даже и не проверяет – а есть ли сигнал INT.

 

 




Поделиться с друзьями:


Дата добавления: 2013-12-12; Просмотров: 406; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.