Transcript Процедура
Архитектура ЭВМ Практика 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: передача параметров через стек • Составить программу вычисления выражения: n m i 1 i 1 y 2 i 3 i • Для вычисления суммы создать процедуру Summa; • процедуру Summa разместить во внешнем файле; • передачу параметров (предел суммирования) передать через стек; • результат возвратить в регистре ax. Текст основного файла (main.asm) Текст внешнего файла (sum.asm) • Выполнить трансляцию файлов main.asm и sum.asm по отдельности; • Для компоновки дать команду: alink main sum Пример 3: передача параметров через общую память Этот вариант передачи аргументов предполагает, что вызывающая и вызываемая программы условились использовать некоторую область памяти как общую Для передачи параметров процедуры через общую память необходимо чтобы как в вызывающем модуле, так и в модуле, содержащем вызываемую процедуру был включен общий сегмент данных с одинаковой структурой описания переменных и атрибутом COMMON. Значение COMMON означает, что все сегменты, имеющие одинаковое имя объединяемых модулях, будут располагаться компоновщиком, начиная с одного адреса оперативной памяти. Это значит, что они будут просто перекрываться в памяти и, следовательно, совместно использовать выделенную память. Использование атрибута COMMON Например, для передачи параметров px, py и получения результата re можно использовать данные в сегменте данных mySegment, описанном следующим образом (как в вызывающем, так и в вызываемом модуле): В этом случае, все изменения, произведенные с переменными в одном модуле будут видны и в другом. Теоретический материал об использовании процедур Практическое задание • Изучить пример программ, использующих процедуры для вычисления арифметических выражений. • Разработать программу для своего варианта арифметических действий. • Протестировать программу. Записать в отчет заданные исходные данные и полученные результаты. Вар Задания 1 Составить подпрограмму для вычисления суммы: Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 7; n = 12 2 Составить подпрограмму для вычисления суммы: Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 7; n = 9 3 Составить подпрограмму для вычисления суммы: Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 9; n = 8 Вар Задания 4 Составить подпрограмму для вычисления суммы: Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 10; n = 8 5 Составить подпрограмму для вычисления суммы: Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через общую область памяти. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 5; n = 8 6 Составить подпрограмму для вычисления суммы: Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через общую область памяти. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 5; n = 12 Вар Задания 7 Составить подпрограмму для вычисления суммы: Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 15; n = 12 8 Составить подпрограмму для вычисления суммы: Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -20; n = 5 9 Составить подпрограмму для вычисления суммы: Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -12; n = 30 Вар Задания 10 Составить подпрограмму для вычисления суммы: Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -4; n = 7 11 Составить подпрограмму для вычисления суммы: Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -28; n = 5 12 Составить подпрограмму для вычисления суммы: Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 100; n = 10 Отчет должен содержать: 1. Номер варианта, условие задачи 2. Текст программы с комментариями. 3. Результат тестирования программы (расчетные и полученные результаты тестирования).