КАТЕГОРИИ: Архитектура-(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 – команда вызова перехода Где #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:
Микрооперации 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.
Дата добавления: 2014-01-04; Просмотров: 285; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |