Мегаобучалка Главная | О нас | Обратная связь


Процедуры . Макрокоманды



2019-12-29 172 Обсуждений (0)
Процедуры . Макрокоманды 0.00 из 5.00 0 оценок




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

Описание процедуры может размещается в любом месте программы, но таким образом чтобы на нее случайным образом не попало управление:

- в начале программы, до первой исполняемой команды;

- в конце, после команды возвращающей управление операционной системе;

- промежуточный вариант, тело процедуры располагается внутри другой процедуры или основной программы. В этом случае необходимо предусмотреть обход процедуры командой jmp;

- в другом модуле.

Синтаксис описания процедуры:

Имя_процедуры PROC             заголовок

Команды, директивы                тело процедуры

[ ret ]                                   возврат из процедуры

[имя_процедуры] ENDP           конец процедуры

Вызов процедуры осуществляется командой

CALL [модификатор] имя_процедуры

Команда call передает управление по адресу с символическим адресом имя_процедуры, с сохранением в стеке адреса возврата, команды следующей после команды call.

Возврат из процедуры осуществляется по команде

RET [число]

Команда ret считывает адрес возврата из стека и загружает его в регистры cs и ip/eip, возвращая таким образом управление команде, следующей за командой call. Число – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры. Размер элемента зависит от используемой модели сегментации 32 или 16 разрядной.

Передача аргументов из/в процедуру может осуществляться через регистры, переменные или стек.

 

Пример .

Model small .stack 100h .data w db 25 dup (?) .code vvod proc mov ah, 0ah lea     dx, w int      21h ret vvod endp main: … Call schet Call   vvod … exit: mov ax,4c00h int 21h schet proc .. ret schet endp end main

 

Макрокоманда является одним из многих механизмов замены текста программы. С помощью макрокоманды в текст программы можно вставлять последовательности строк и привязывать их к месту вставки. Макрокоманда представляет собой строку, содержащую некоторое имя – имя макрокоманды, предназначенное для того, чтобы быть замещенным одной или несколькими другими строками при трансляции.

Для работы с макрокомандой вначале необходимо задать ее шаблон-описание, так называемое макроопределение.

Имя_макрокоманды MACRO [список_формальных_аргументов]

<Тело макроопределения>

ENDM

Существует три варианта расположения макроопределений:

- в начале исходного текста программы до сегмента кода и данных с тем, чтобы не ухудшать читабельность программы. В данном случае макрокоманды будут актуальны только в пределах этой программы;

- в отдельном файле. Для того, чтобы использовать эти макроопределения в других программах, необходимо в начале исходного текста этих программ записать директиву

 include имя_файла

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

Include macrobibl.inc ;в исходный текст программы будут вставлены строки из macrobibl.inc

Purge outstr, exit ;за исключением макроопределений outstr, exit

 

Активизация макроса осуществляется следующим образом:

Имя_макрокоманды список_ фактических_ аргументов

Model small Vivod macro rg Mov  dl, rg Mov  ah, 02h Int     21h endm .data .. .code .. vivod al .. Model small sravnenie         macro rg, met cmp rg , ‘a’ ja met add rg, 07h met: add rg, 30h endm .data .. .code .. sravnenie al, m1..

 

Функционально макроопределения похожи на процедуры. Сходство их в том, что и те, и другие достаточно один раз где-то описать, а затем вызывать их специальным образом. На этом их сходство заканчивается, и начинаются различия, которые в зависимости от целевой установки можно рассматривать и как достоинства и как недостатки:

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

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


Пример 17. Найти максимальный элементы в каждой строке массива 5*7, с использованием процедур

model    small

.stack 100h

.data

mas dw 5 dup( 7 dup(0))

max dw 0

subj db ‘введите строку',13,10,'$'

.code

;процедура ввода строки

vvod_str         proc

mov ah, 09h

lea dx, subj

int 21h

mov cx, 07h

mov ah, 01h

outcykl: int 21h

mov mas[si], ax

inc si

inc si

loop outcykl

ret

vvod_str         endp

;процедура поиска максимального в строке

poick­_­maxi    proc

mov cx, 06h

mov dx, mas[si]

maxi: add si, 2

cmp dx, mas[si]

ja  min1 ;если меньше то переходим

mov dx, mas[si]

min1: loop maxi

Ret

poick­_­maxi    endp

main proc

mov ax, @data

mov ds, ax

xor si, si       ;заполнение массива

mov cx, 05h

incykl:   push cx

callvvod_str    ;вызов процедуры по вводу строки

pop cx

loop incykl

;поиск максимального/ минимального в строках

xor si,si

mov cx, 05h

s1t: push cx

callpoick­_­maxi    ;вызов процедуры поиска максимального элемента

mov ah, 02h           ;вывод максимального

int 21h

pop cx

loop s1t

mov ax, 04c00h

int 21h

endр main




2019-12-29 172 Обсуждений (0)
Процедуры . Макрокоманды 0.00 из 5.00 0 оценок









Обсуждение в статье: Процедуры . Макрокоманды

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (172)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)