- •Модульное программирование
- •Технологии программирования
- •Структурное программирование
- •Концепция модульного программирования
- •Процедуры в языке асемблера
- •Организация интерфейса с процедурой
- •Передача аргументов через регистры
- •Передача аргументов через общую область памяти
- •Передача аргументов через стек
- •Использование директив extrn и public
- •Возврат результата из процедуры
- •Связь ассемблера с языками высокого уровня
- •Связь Pascal — асемблер
- •Связь с—асемблер
- •Подведем некоторые итоги:
Организация интерфейса с процедурой
Прежде всего определимся с такими понятиями, как аргумент, переменная, константа. Они часто используются в контексте других понятий — модуля и процедуры, которые можно считать синонимами, хотя модуль — это все же более общее понятие.
Аргумент — это ссылка на некоторые данные, которые требуются для выполнения возложенных на модуль функций и размещенных вне этого модуля. По аналогии с макрокомандами рассматривают понятия формального и фактического аргументов. Исходя из этого, формальный аргумент можно рассматривать не как непосредственные данные или их адрес, а как «местодержатель» для действительных данных, которые будут подставлены в него с помощью фактического аргумента. Формальный аргумент можно рассматривать как элемент интерфейса модуля (конкретный вывод «скарта»), а фактический аргумент — это то, что фактически передается на место формального аргумента.
Переменная — это нечто, размещенное в регистре или ячейке памяти, что может в дальнейшем подвергаться изменению.
Константа — данные, значение которых никогда не изменяется.
Таким образом, если некоторые данные в модуле могут подвергаться изменению, то это переменные. Если переменная находится за пределами модуля (процедуры) и должна быть как-то передана в него, то для модуля она является формальным аргументом. Значение переменной передается в модуль для замещения соответствующего параметра при помощи фактического аргумента. Теперь, когда вы уяснили, чем отличаются формальные и фактические аргументы, мы далее будем называть их обобщенно — аргументы, а вы по контексту будете понимать, о каком виде аргументов идет речь.
Если входные данные для модуля — переменные, то один и тот же модуль можно использовать многократно для разных наборов значений этих переменных. Но как организовать передачу значений переменных в модуль (процедуру)? При программировании на языке высокого уровня программист ограничен в выборе способов передачи аргументов теми рамками, которые для него оставляет компилятор. В языке ассемблера практически нет никаких ограничений на этот счет, и фактически решение проблемы передачи аргументов предоставлено программисту.
Поэтому существуют следующие варианты передачи аргументов в модуль (процедуру):
через регистры;
через общую область памяти;
через стек;
с помощью директив extrn и public.
Передача аргументов через регистры
Это наиболее простой в реализации способ передачи данных. Данные, переданные подобным способом, становятся доступными немедленно после передачи управления процедуре. Этот способ очень популярен при небольшом объеме передаваемых данных.
Ограничения на способ передачи аргументов через регистры:
небольшое число доступных для пользователя регистров;
нужно постоянно помнить о том, какая информация в каком регистре находится;
ограничение размера передаваемых данных размерами регистра. Если раз¬мер данных превышает 8, 16 или 32 бит, то передачу данных посредством регистров произвести нельзя. В этом случае передавать нужно не сами дан¬ные, а указатели на них.
Такой способ передачи аргументов широко применяется при вызове функций DOS.
Ранее мы обсуждали программу, использующую макрокоманду, которая подсчитывала длину строки, оканчивающейся символом $. Для сравнения эффективности применения макрокоманд и процедур при программировании разработаем аналогичную программу (листинг 14.3), но с использованием процедуры подсчета количества символов в строке с конечным символом $.
Для подсчета символов программа использует процедуру CountSymbol, расположенную в конце программы. Длина строки — не более 99 символов. Адрес строки передается процедуре как аргумент через регистр si. Результат подсчета возвращается в регистр bl и выводится на экран в вызывающей программе. Для вывода на экран используется прямой доступ к видеобуферу.
Листинг 14.3. Передача аргументов через регистры
