280 likes | 517 Views
Архитектура ЭВМ. Практика 6 . Организация подпрограмм. Процедуры. Процедура , часто называемая также подпрограммой , — это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи.
E N D
Архитектура ЭВМ Практика 6. Организация подпрограмм
Процедуры Процедура, часто называемая также подпрограммой, — это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи. Процедура представляет собой группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку.
Описание процедуры Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP. Заголовок процедуры Тело процедуры Конец процедуры
Место размещения процедуры Процедура может размещаться в любом месте программы в текущем, или во внешнем файле, но так, чтобы на нее случайным образом не попало управление. Рекомендуется записывать процедуры в конце кодового сегмента текущей программы, или в отдельном файле (модуле).
Вызов и возврат из процедуры Для вызова подпрограммы (процедуры) используется команда: CALL<имя_процедуры> • Стек := ip; • ip := Адрес процедуры; Для возврата из подпрограммы (процедуры) используется команда: RET [число N] • ip := Стек; • Очистить стек на N байт;
Способы размещения процедуры Методы разделения программы на модули
Использование процедуры из текущего файла
Объявление и использование внешних процедур Для того чтобы объявить о видимых извне объектах, программа должна использовать две директивы: - в вызывающем модуле: EXTRN имя:тип, …, имя:тип - в вызываемом модуле: PUBLIC имя, …, имя имя - имя переменной или процедуры; тип - для переменной: byte, word и т.д.; - для процедуры: proc [near]/far
Использование процедуры из внешнего файла Текст главного файла:
Использование процедуры из внешнего файла Текст внешнего файла:
Компиляция программы из нескольких исходных файлов При создании программы, состоящей из нескольких модулей, каждый модуль транслируется (tasm.exe) по отдельности, а компоновщик (alink.exe) из нескольких объектных модулей строит один загрузочный (exe-файл). При этом, в списке объектных файлов первым должен быть главный файл (из которого вызываются другие), например: alink main mod1 mod2
Способы передачи параметров Существуют следующие способы передачи параметров в процедуру и возврата результатов из процедуры: • через регистры; • через общую область памяти; • через стек.
Пример 1: передача параметров через регистры • Составить программу вычисления: y = n! - m! • Для вычисления факториала создать подпрограмму (процедуру Factor с возвращением результата). • Процедуру Factorзаписать в текущем файле; • Передачу параметра в процедуру и возврат результата организовать через регистры cx и ax соответственно.
Пример 2: передача параметров через стек • Составить программу вычисления выражения: • Для вычисления суммы создать процедуру Summa; • процедуру Summaразместить во внешнем файле; • передачу параметров (предел суммирования) передать через стек; • результат возвратить в регистре ax.
Текст внешнего файла (sum.asm) • Выполнить трансляцию файлов main.asm и sum.asm по отдельности; • Для компоновки дать команду: alink main sum
Пример 3: передача параметров через общую память Этот вариант передачи аргументов предполагает, что вызывающая и вызываемая программы условились использовать некоторую область памяти как общую Для передачи параметров процедуры через общую память необходимо чтобы как в вызывающем модуле, так и в модуле, содержащем вызываемую процедуру был включен общий сегмент данных с одинаковой структурой описания переменных и атрибутом COMMON. Значение COMMON означает, что все сегменты, имеющие одинаковое имя объединяемых модулях, будут располагаться компоновщиком, начиная с одного адреса оперативной памяти. Это значит, что они будут просто перекрываться в памяти и, следовательно, совместно использовать выделенную память.
Использование атрибута COMMON Например, для передачи параметров px, py и получения результата reможно использовать данные в сегменте данных mySegment, описанном следующим образом (как в вызывающем, так и в вызываемом модуле): В этом случае, все изменения, произведенные с переменными в одном модуле будут видны и в другом.
Теоретический материал об использовании процедур
Практическое задание • Изучить пример программ, использующих процедуры для вычисления арифметических выражений. • Разработать программу для своего варианта арифметических действий. • Протестировать программу. Записать в отчет заданные исходные данные и полученные результаты.
Отчет должен содержать: • Номер варианта, условие задачи • Текст программы с комментариями. • Результат тестирования программы (расчетные и полученные результаты тестирования).