ЛР №5 Взаимодействие программных компонентов, стек и подпрограммы
Взаимодействие программных компонентов друг с другом. Использование стека, подпрограмм и вложенных процедур
Для кого этот документ
- Студентам курса "Организация ЭВМ"
- Необходимое ПО: Quartus II
Цель работы
Изучить, каким образом выполняется взаимодействие программных компонентов друг с другом; уяснить, как работает стек, как в процессорной системе использовать исходные данные, размещенные в отдельном файле.
Объекты изучения
- регистровая структура процессора;
- стек;
- команды процессора call, callr, ret;
- приложение Intel Monitor Program (IMP) по части выполнения команд Memory fill, Load file into memory.
Планируемые результаты обучения
После выполнения этой работы студенты должны уметь:
- Создавать приложения, состоящие из нескольких программных компонентов;
- Организовывать взаимодействие программных компонентов через регистры процессора и через стек;
- Использовать вложенные процедуры;
- Использовать в своих приложениях исходные данные, размещенные в отдельном файле.
Исходные файлы лабораторной работы
В этой работе используется предварительно созданная процессорная система, с которой студенты частично познакомились в предыдущих лабораторных работах.
В качестве исходного файла предлагается использовать файл с программой нахождения наибольшего числа из списка, подготовленный в соответствии с индивидуальным вариантом задания при выполнении пункта 2.3 лабораторной работы номер два.
Подготовка к лабораторной работе
- Изучите по учебной литературе, какие способы используются для передачи параметров подпрограммам и как выполняется возврат результата. Поместите в отчет краткое описание.
- Ознакомьтесь с командами процессора NIOS II вызова процедур call, callr, и возврата из них ret [12,3]. Уясните, к какому формату относятся эти команды, и как происходит их выполнение. Поместите в отчет их краткое описание.
- Изучите, какие команды процессора NIOS II используются для работы со стеком и какие регистры используются для этого. Поместите в отчет эту информацию, включая форматы вышеуказанных команд.
- Изучите описание приложения Intel Monitor Program (IМР) [10,11]. Выясните, как заполнить диапазон памяти процессорной системы некоторым постоянным значением с помощью команды Memory fill, как выполнить загрузку файла с исходными данными в оперативную память процессорной системы. Поместите эти материалы в отчет.
- Уясните содержание пунктов задания, выполняемого в текущей лабораторной работе.
- Подготовьте файл с исходными данными, соответствующими индивидуальному варианту задания, для выполнения пункта 1 части 4.
- Подготовьте программные заготовки для выполнения остальных пунктов задания.
- Уясните индивидуальное задание. Подготовьте программу для его выполнения.
Вопросы для самоконтроля
- Что такое стек, для чего он нужен, и как он работает?
- Какой способ адресации используется для обращения к стеку?
- Какие команды и какого формата используются для обращения к стеку?
- Какие способы используются для передачи параметров вызываемым процедурам? Как возвращается результат?
- Какие команды и какого формата используются для вызова процедур и возврата обратно?
- Какой способ адресации используется в командах вызова и возврата?
- Что такое вложенная процедура?
- Каким образом следует организовать корректный возврат из вложенных процедур?
- Можно ли исходные данные для программы разместить в отдельном файле? Как это сделать?
- Как с помощью приложения IMP загрузить в оперативную память процессорной системы исходные данные из файла, начиная с заданного адреса?
- Как заставить программу обрабатывать загруженные из файла исходные данные?
- Если переместить исполняемый код программы в другую область оперативной памяти, будет ли программа корректно работать?
- Какие команды перестанут корректно выполняться после перемещения программы в оперативной памяти?
- Можно ли программный код использовать как исходные данные в другой программе? Приведите пример такой программы.
Порядок выполнения лабораторной работы
Часть 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. Включите в отчет ваши наблюдения и объяснения.
Отчетные материалы
Отчетные материалы должны содержать:
- Цель лабораторной работы.
- Материалы, связанные с подготовкой к работе, включая теоретическую часть.
- Информацию по выполнению каждого пункта задания. Причем в отчете должны содержаться выполняемые Вами действия, наблюдаемые результаты, и Ваши объяснения.
- Написанные Вами фрагменты программ, включая программу для выполнения индивидуального задания.
- Зарисовку ОП с отображением в ней основной программы, обрабатываемого списка, процедур Max, Out_on_LEDR, Copy и стека.
- Краткое заключение.
Защита лабораторной работы
Для защиты работы студенты должны продемонстрировать умение:
- Создавать приложения, состоящие из нескольких программных компонентов;
- Организовывать взаимодействие программных компонентов друг с другом через регистры процессора и через стек;
- Использовать вложенные процедуры;
- Использовать в своих приложениях исходные данные, размещенные в отдельном файле;
- Выполнять перемещение программного кода в ОП и оценивать возможность его корректного выполнения.
Приложения
Приложение – В «Дополнительные задачи»
Напишите программу, которая решает какую-либо задачу из нижеприведенного списка. В качестве варианта используйте номер стенда.
-
Напишите программу, которая использует рекурсию для вычисления факториала числа N. N!=N(N-1)(N-2)…321. Заметьте, что N!=N(N-1)! Программа включает подпрограмму Factor, которая вызывает сама себя до тех пор, пока желаемый факториал не будет получен. Основная программа должна ввести параметр N, задаваемый с помощью переключателей, затем передать N как параметр, размещая его в стеке. Подпрограмма может вернуть результат через регистр R4, либо через стек. Программа Factor вызывает сама себя. Перед вызовом не забудьте сохранить адрес возврата (регистр ra) в стеке и восстановить его после возврата. Покажите результат работы программы преподавателю.
-
Напишите программу, которая осуществляет вывод на LCD содержимого области памяти, представленного в шестнадцатеричном виде. Оформите ее в виде подпрограммы, которой передаются параметры: начальный адрес области памяти, количество отображаемых байтов и номер начальной позиции на LCD дисплее.
-
Напишите программу, которая отображает содержимое 32-разрядного регистра процессора на 7-сегментных индикаторах HEX7-HEX0 в виде шестнадцатеричного числа. Оформите ее в виде процедуры HEX_Display, которой передается параметр – выводимое значение - через регистр процессора.
-
Напишите программу, которая осуществляет вывод на 7-сегментные индикаторы содержимого области памяти, представленного в шестнадцатеричном виде. Оформите ее в виде подпрограммы, которой передаются параметры: начальный адрес области памяти, количество отображаемых байт (не более 4). Младшие байты отображаются справа.
-
Напишите программу, которая осуществляет упорядочивание чисел в списке в убывающем порядке. Каждое число представляет собой 32-разрядное число без знака. Оформите ее в виде подпрограммы, которой передаются параметры: адрес списка в ОП, число слов в списке.
-
Напишите программу, вычисляющую первые n чисел Фибоначчи. Числа 32 – разрядные. Они вычисляются по формуле An=An-1+An-2 и и записываются в оперативную память. Первые числа выглядят следующим образом: 0,1,1,2,3,5,8…. Оформите в виде подпрограммы, которой передаются параметры: адрес ОП, число n.
-
Напишите программу, вычисляющую максимальное количество повторяющихся нулевых и единичных разрядов в числе, хранящемся в ОП. Адрес числа может быть произвольным. Оформите в виде подпрограммы, передав в качестве параметров: адрес ОП и размер числа в байтах (не более 4). Вывод найденных значений осуществите на красные и зеленые светодиоды.
-
Напишите программу, вычисляющую количество положительных и отрицательных фронтов в числе, хранящемся в ОП. Например, число 0b10010110 содержит 2 положительных и 3 отрицательных фронта. Адрес числа может быть произвольным. Оформите в виде подпрограммы, передав в качестве параметров адрес ОП и размер числа в байтах (не более 4). Вывод найденных значений осуществите на красные и зеленые светодиоды.
-
Оформите в виде отдельной процедуры программу, выполняющую вывод на LCD экран текстовой информации. В качестве параметра используйте начальный адрес в ОП выводимой строки и параметр передавайте через регистр процессора. Рассмотрите возможность использования этой процедуры для вывода текстовой информации в режиме бегущей строки.
Чеклист выполнения
- Работа выполнена
- Отчет подготовлен