Процедура

Download Report

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. Результат тестирования программы
(расчетные и полученные результаты
тестирования).