русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Директива ARG


Дата добавления: 2014-11-27; просмотров: 2338; Нарушение авторских прав


Директива ARG определяет аргументы, передаваемые в процедуру. Ее применение позволяет обращаться к аргументам по их именам, а не смещениям относительно содержимого bp. К примеру, если в начале рассматриваемой нами процедуры на ассемблере asmproc задать директиву ARG в виде arg kol:word,y:word,х:word,chr:byte, то к аргументам процедуры можно будет обращаться по их име­нам, без подсчета смещений. Ассемблер сам выполнит всю необходимую работу. В этом можно убедиться, запустив программу в отладчике. Обратите внимание: порядок следования аргументов в директиве arg является обратным порядку их следования в описании . процедуры (строка procedure asmproc(ch: char: x, у, kol: integer); external; в программе на Pascal). Процедура asmproc с использова­нием директивы arg представлена в листинге 3.

После того как решена проблема передачи аргументов в процедуру и выполнены все необходимые действия, возникает очередной вопрос - как правильно возвра­тить управление? При возврате управления в программу на Pascal нужно помнить, что соглашения этого языка требуют, чтобы вызываемые процедуры самостоя­тельно очищали за собой стек. Программа на ассемблере также должна удовлет­ворять этому требованию и заботиться об очистке стека перед своим завершени­ем. Для этого необходимо составить эпилог.

Действия, выполняемые, кодом эпилога для связи Pascal - ассемблер:

1. Записать содержимое bp в sp командой mov sp, bp. Это действие восстанавли­вает в sp значение, которое было на момент входа в процедуру. Необходимость в этом действии возникает в том случае, если в процедуре производилась ра­бота со стеком: В листинге 14.3 такой работы не было, поэтому код эпилога содержит только действия следующих пунктов.

2. Восстановить сохраненный в стеке регистр bp.

3. Удалить из стека переданные процедуре аргументы.



Для удаления из стека аргументов можно использовать различные способы:

h явно скорректировать значение sp, переместив указатель стека на необходи­мое количество байт в положительную сторону. Это - не универсальный способ, к тому же он чреват ошибками, особенно при частых модификациях программы;

hиспользовать в директиве arg после записи последнего аргумента операнд, состоящий из символа равенства "=" и идентификатора, указанного за ним в следующей синтаксической конструкции:= идентификатор. В этом случае TASM при обработке директивы arg подсчитает количество байт, занятых всеми ар­гументами, и присвоит их значение идентификатору. В нашем случае директиву arg можно определить так: arg ch:byte;x:word;y:word;ko1:word=a_size. TASM после обработки данной директивы присвоит имени a_size значение 8 (байт). Это имя впоследствии нужно будет указать в качестве операнда команды ret:

ret a_size

Использование директивы arg (листинг 3).

{prg3.pas}

{Программа на Pascal, вызывающая процедуру на ассемблере, полностью совпадает с листингом 1}

;prg3.asm

MASM

MODEL small

STACK 256

.code

main:

asmproc proc near

;обьявление аргументов:

arg kol:WORD.y:WORD.x:WORD,chr:BYTE=a_size

PUBLIC asmproc

push bp ; сохранение, указателя базы

mov bp,sp ; настройка bp на стек через sp

mov dh,byte ptr у ; у в dh

mov dl,byte ptr x ; x в d1

mov ah,02h ; номер службы BIOS

int l0h ; вызов прерывания BIOS

mov ah,09h ; номер службы BIOS

mov al,chr ; символ - в а1

том b1,07h ; маска вывода символа

хог bh,bh

mov cx,kol ; ko1 в сх

int l0h ; вызов прерывания BIOS

pop bp ; эпилог

ret a_size ; будет ret 8 и выход из процедуры

asmproc endp ; конец процедуры

end main ; конец программы



<== предыдущая лекция | следующая лекция ==>
Передача аргументов (и возврат результата в случае функции) | Использование операндов директивы model


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.467 сек.