Перейти к основному содержимому

ЛР №5 Взаимодействие программных компонентов, стек и подпрограммы

Взаимодействие программных компонентов друг с другом. Использование стека, подпрограмм и вложенных процедур

Для кого этот документ

  • Студентам курса "Организация ЭВМ"
  • Необходимое ПО: Quartus II

Цель работы

Изучить, каким образом выполняется взаимодействие программных компонентов друг с другом; уяснить, как работает стек, как в процессорной системе использовать исходные данные, размещенные в отдельном файле.

Объекты изучения

  • регистровая структура процессора;
  • стек;
  • команды процессора call, callr, ret;
  • приложение Intel Monitor Program (IMP) по части выполнения команд Memory fill, Load file into memory.

Планируемые результаты обучения

После выполнения этой работы студенты должны уметь:

  • Создавать приложения, состоящие из нескольких программных компонентов;
  • Организовывать взаимодействие программных компонентов через регистры процессора и через стек;
  • Использовать вложенные процедуры;
  • Использовать в своих приложениях исходные данные, размещенные в отдельном файле.

Исходные файлы лабораторной работы

В этой работе используется предварительно созданная процессорная система, с которой студенты частично познакомились в предыдущих лабораторных работах.

В качестве исходного файла предлагается использовать файл с программой нахождения наибольшего числа из списка, подготовленный в соответствии с индивидуальным вариантом задания при выполнении пункта 2.3 лабораторной работы номер два.

Подготовка к лабораторной работе

  1. Изучите по учебной литературе, какие способы используются для передачи параметров подпрограммам и как выполняется возврат результата. Поместите в отчет краткое описание.
  2. Ознакомьтесь с командами процессора NIOS II вызова процедур call, callr, и возврата из них ret [12,3]. Уясните, к какому формату относятся эти команды, и как происходит их выполнение. Поместите в отчет их краткое описание.
  3. Изучите, какие команды процессора NIOS II используются для работы со стеком и какие регистры используются для этого. Поместите в отчет эту информацию, включая форматы вышеуказанных команд.
  4. Изучите описание приложения Intel Monitor Program (IМР) [10,11]. Выясните, как заполнить диапазон памяти процессорной системы некоторым постоянным значением с помощью команды Memory fill, как выполнить загрузку файла с исходными данными в оперативную память процессорной системы. Поместите эти материалы в отчет.
  5. Уясните содержание пунктов задания, выполняемого в текущей лабораторной работе.
  6. Подготовьте файл с исходными данными, соответствующими индивидуальному варианту задания, для выполнения пункта 1 части 4.
  7. Подготовьте программные заготовки для выполнения остальных пунктов задания.
  8. Уясните индивидуальное задание. Подготовьте программу для его выполнения.

Вопросы для самоконтроля

  1. Что такое стек, для чего он нужен, и как он работает?
  2. Какой способ адресации используется для обращения к стеку?
  3. Какие команды и какого формата используются для обращения к стеку?
  4. Какие способы используются для передачи параметров вызываемым процедурам? Как возвращается результат?
  5. Какие команды и какого формата используются для вызова процедур и возврата обратно?
  6. Какой способ адресации используется в командах вызова и возврата?
  7. Что такое вложенная процедура?
  8. Каким образом следует организовать корректный возврат из вложенных процедур?
  9. Можно ли исходные данные для программы разместить в отдельном файле? Как это сделать?
  10. Как с помощью приложения IMP загрузить в оперативную память процессорной системы исходные данные из файла, начиная с заданного адреса?
  11. Как заставить программу обрабатывать загруженные из файла исходные данные?
  12. Если переместить исполняемый код программы в другую область оперативной памяти, будет ли программа корректно работать?
  13. Какие команды перестанут корректно выполняться после перемещения программы в оперативной памяти?
  14. Можно ли программный код использовать как исходные данные в другой программе? Приведите пример такой программы.

Порядок выполнения лабораторной работы

Часть 1. Передача параметров через регистры процессора

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

1.1. Запустите приложение Intel Monitor Program. Откройте проект, созданный в 3 лабораторной работе. Выполните программу нахождения наибольшего числа из списка. Убедитесь в работоспособности программы, меняя исходные числа во вкладке Memory IMP и наблюдая полученный результат.

1.2. Часть кода, в которой выполняется поиск максимального числа из списка оформите в виде подпрограммы с именем Max. Для передачи параметров подпрограмме используйте регистры r5, для указания числа слов в списке, и регистр r6, для указания начального адреса списка. Подпрограмма будет осуществлять анализ содержимого ячеек памяти, и находить наибольшее число. Подпрограмма должна записать результат в регистр r7 и завершиться командой ret.

1.3. Список обрабатываемых чисел разместите в отдельном сегменте данных в начале статической памяти. В основной программе заполняются регистры r5 и r6 для передачи параметров, и осуществляется вызов подпрограммы Мах с использованием команды call. Затем, после возврата результата в r7 она выводит найденное число на красные светодиоды. Проверьте правильность работы программы, визуально наблюдая содержимое анализируемой ею области памяти, используя вкладку Memory, содержимое регистра r7 в регистровом окне приложения IMP и младшую часть результата, отображаемую на светодиодах. Рекомендуется поставить контрольные точки на командах call и ret и сами эти команды выполнить по шагам, осмысливая производимые ими действия.

1.4. Выполните предыдущий пункт задания, используя команду callr.

1.5. Поместите в отчет машинные коды команд call, callr и ret. При подготовке отчета выполните их декодирование и осмыслите содержимое отдельных полей этих команд.

1.6. Оформите вывод результата на красные светодиоды в виде самостоятельной процедуры Out_on_LEDR, передав в качестве параметра отображаемое число через какой-либо регистр процессора. Например, через r7.

1.7. Включите в основную программу команду вызова этой процедуры. Наблюдайте результат работы программы. Поместите в отчет схему взаимодействия основной программы с процедурами. Основная программа начинается с метки _start и завершается командой stop и содержит две команды call. Процедуры начинаются с меток Max и Out_on_LEDR, соответственно и завершаются командой ret.

Часть 2. Использование вложенных процедур

2.1. Модифицируйте программу из предыдущей части следующим образом. Выполните вывод найденного числа на светодиоды вызвав процедуру Out_on_LEDR внутри подпрограммы Max.

2.2. Поставьте контрольную точку в конце основной программы. Запустите программу. Убедитесь, что возврат в основную программу не выполняется. Выясните причину и устраните ее. Для этого на командах call и ret рекомендуется поставить контрольные точки и выполнить их по шагам, осмысливая выполняемые ими действия.

2.3. Убедитесь в работоспособности модифицированной программы. Покажите результат ее работы преподавателю. Поместите в отчет листинг отлаженной программы и схему взаимодействия основной программы с обоими процедурами.

Часть 3. Передача параметров через стек

1.1. Модифицируйте программу из первой части таким образом, чтобы передача параметров процедуре Max осуществлялась через стек. Для этого в основной программе определите в качестве вершины стека адрес последнего слова используемой в процессорной системе динамической памяти. В качестве указателя стека используйте регистр sp процессора. Обратите внимание на то, что после помещения в стек или извлечения из стека автоматического изменения регистра sp не происходит. Возврат найденного максимального числа из списка также должен осуществляться через стек. Причем, результат должен быть помещен в то место в стеке, где перед вызовом были размещены передаваемые процедуре параметры. Для этого используйте соответствующее смещение относительно текущего указателя стека.

1.2. Общепринятый прием – сохранение содержимого регистров, используемых в подпрограмме, в стеке в начале работы подпрограммы и восстановление их перед завершением подпрограммы. Непосредственно перед выполнением команды ret, выполните коррекцию указателя стека так, чтобы он указывал на возвращаемый результат. Чтобы визуально наблюдать корректное восстановление используемых в подпрограмме регистров рекомендуется в основной программе поместить в них легкозапоминаемые значения, например, в регистр r5 число 555, в регистр r6 число 666, в регистр r7 число 777, и т.д. Отладьте программу, убедитесь в ее работоспособности, покажите результат преподавателю. Поместите в отчет листинг отлаженной программы и зарисовку стека перед выполнением команды call и после выполнения команды ret.

1.3. Запускайте программу, изменяя исходные данные. Чтобы повторно не компилировать программу изменяйте числа в списке непосредственно в ОП, используя вкладку Memory приложения IMP. Следует напомнить, что список чисел размещен в самом начале статической памяти.

Часть 4. Использование файлов с исходными данными в IMP

4.1. Создайте файл и поместите в него подготовленный ранее для вашей программы список чисел. Для этого используйте любой текстовый редактор и шестнадцатеричную форму представление чисел. В качестве разделителя может использоваться любой символ. Загрузите файл в оперативную память, начиная с заданного адреса. Используйте команду Load file into memory из меню Action приложения IMP. В появившемся окне задайте имя файла с указанием пути к нему, в поле «формат файла» окна браузера задайте Delimited hexadecimal value file, символ разделителя и начальный адрес загрузки в оперативной памяти.

4.2. Рассмотрите возможность загрузки файла как отдельно от кода, например в статической памяти, так в непосредственной близости к программному коду. Убедитесь в правильности загрузки списка чисел в ОП.

4.3. Модифицируйте программу из первой части таким образом, чтобы она передавала подпрограмме через регистры число слов в списке, соответствующее подготовленному Вами файлу и начальный адрес ОП, куда был загружен файл. После получения результата через регистр, основная программа выводит его на светодиоды. Покажите результат преподавателю.

Часть 5. Перемещение кода программы в ОП, и оценка корректности его выполнения

5.1. Напишите процедуру Copy, которая выполняет копирование одной области ОП в другую область памяти, начиная с заданного адреса. Используйте следующие параметры: начальный и конечный адреса копируемой области, адрес в ОП, с которого следует разместить копируемый фрагмент памяти. Создайте новый файл и добавьте текст этой процедуры в него, рекомендуется давать имя файлу, соответствующее его содержимому.

5.2. Напишите фрагмент программы, которая будет выполнять копирование части сегмента кода, включая основную программу и две процедуры Max и Out_on_Ledr (с метки start_ до метки Copy -4) по адресу в ОП, смещенному на 0х1000 от начала сегмента кода. Поставьте метку на первой команде созданного вами фрагмента кода. Добавьте фрагмент к файлу с функцией Copy. В Memory Setting укажите эту метку в качестве стартового адреса программы.

5.3. Выполните компиляцию и загрузку обновленной программы. Убедитесь, что текущий адрес в РС указывает на начало добавленного фрагмента. Следует напомнить, что во вкладке Disassembly текущая команда выделяется желтым цветом.

5.4. Поставьте контрольную точку в конце фрагмента и выполните его в автоматическом режиме.

5.5. Используя вкладку Memory визуально убедитесь, что копирование основной программы вместе с двумя процедурами Max и Out_on_Ledr выполнилось правильно.

5.6. Попробуйте выполнить скопированный код основной программы, предварительно установив в счетчике команд его адрес. Проверьте правильность перехода к вызываемым процедурам и возврата из них. Для этого рекомендуется поставить контрольные точки на командах call, ret и на последней команде основной программы с меткой stop. Включите в отчет ваши наблюдения и объяснения.

Отчетные материалы

Отчетные материалы должны содержать:

  1. Цель лабораторной работы.
  2. Материалы, связанные с подготовкой к работе, включая теоретическую часть.
  3. Информацию по выполнению каждого пункта задания. Причем в отчете должны содержаться выполняемые Вами действия, наблюдаемые результаты, и Ваши объяснения.
  4. Написанные Вами фрагменты программ, включая программу для выполнения индивидуального задания.
  5. Зарисовку ОП с отображением в ней основной программы, обрабатываемого списка, процедур Max, Out_on_LEDR, Copy и стека.
  6. Краткое заключение.

Защита лабораторной работы

Для защиты работы студенты должны продемонстрировать умение:

  • Создавать приложения, состоящие из нескольких программных компонентов;
  • Организовывать взаимодействие программных компонентов друг с другом через регистры процессора и через стек;
  • Использовать вложенные процедуры;
  • Использовать в своих приложениях исходные данные, размещенные в отдельном файле;
  • Выполнять перемещение программного кода в ОП и оценивать возможность его корректного выполнения.

Приложения

Приложение – В «Дополнительные задачи»

Напишите программу, которая решает какую-либо задачу из нижеприведенного списка. В качестве варианта используйте номер стенда.

  1. Напишите программу, которая использует рекурсию для вычисления факториала числа N. N!=N(N-1)(N-2)…321. Заметьте, что N!=N(N-1)! Программа включает подпрограмму Factor, которая вызывает сама себя до тех пор, пока желаемый факториал не будет получен. Основная программа должна ввести параметр N, задаваемый с помощью переключателей, затем передать N как параметр, размещая его в стеке. Подпрограмма может вернуть результат через регистр R4, либо через стек. Программа Factor вызывает сама себя. Перед вызовом не забудьте сохранить адрес возврата (регистр ra) в стеке и восстановить его после возврата. Покажите результат работы программы преподавателю.

  2. Напишите программу, которая осуществляет вывод на LCD содержимого области памяти, представленного в шестнадцатеричном виде. Оформите ее в виде подпрограммы, которой передаются параметры: начальный адрес области памяти, количество отображаемых байтов и номер начальной позиции на LCD дисплее.

  3. Напишите программу, которая отображает содержимое 32-разрядного регистра процессора на 7-сегментных индикаторах HEX7-HEX0 в виде шестнадцатеричного числа. Оформите ее в виде процедуры HEX_Display, которой передается параметр – выводимое значение - через регистр процессора.

  4. Напишите программу, которая осуществляет вывод на 7-сегментные индикаторы содержимого области памяти, представленного в шестнадцатеричном виде. Оформите ее в виде подпрограммы, которой передаются параметры: начальный адрес области памяти, количество отображаемых байт (не более 4). Младшие байты отображаются справа.

  5. Напишите программу, которая осуществляет упорядочивание чисел в списке в убывающем порядке. Каждое число представляет собой 32-разрядное число без знака. Оформите ее в виде подпрограммы, которой передаются параметры: адрес списка в ОП, число слов в списке.

  6. Напишите программу, вычисляющую первые n чисел Фибоначчи. Числа 32 – разрядные. Они вычисляются по формуле An=An-1+An-2 и и записываются в оперативную память. Первые числа выглядят следующим образом: 0,1,1,2,3,5,8…. Оформите в виде подпрограммы, которой передаются параметры: адрес ОП, число n.

  7. Напишите программу, вычисляющую максимальное количество повторяющихся нулевых и единичных разрядов в числе, хранящемся в ОП. Адрес числа может быть произвольным. Оформите в виде подпрограммы, передав в качестве параметров: адрес ОП и размер числа в байтах (не более 4). Вывод найденных значений осуществите на красные и зеленые светодиоды.

  8. Напишите программу, вычисляющую количество положительных и отрицательных фронтов в числе, хранящемся в ОП. Например, число 0b10010110 содержит 2 положительных и 3 отрицательных фронта. Адрес числа может быть произвольным. Оформите в виде подпрограммы, передав в качестве параметров адрес ОП и размер числа в байтах (не более 4). Вывод найденных значений осуществите на красные и зеленые светодиоды.

  9. Оформите в виде отдельной процедуры программу, выполняющую вывод на LCD экран текстовой информации. В качестве параметра используйте начальный адрес в ОП выводимой строки и параметр передавайте через регистр процессора. Рассмотрите возможность использования этой процедуры для вывода текстовой информации в режиме бегущей строки.

Чеклист выполнения

  • Работа выполнена
  • Отчет подготовлен