Процедуры . Макрокоманды
Процедура, часто называемая подпрограммой, - это правильным образом оформленная совокупность команд, которая будучи однократно описана, при необходимости может быть вызвана в любом месте программы. Процедура представляет собой группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку. В простейшем случае программа может состоять из одной процедуры. Описание процедуры может размещается в любом месте программы, но таким образом чтобы на нее случайным образом не попало управление: - в начале программы, до первой исполняемой команды; - в конце, после команды возвращающей управление операционной системе; - промежуточный вариант, тело процедуры располагается внутри другой процедуры или основной программы. В этом случае необходимо предусмотреть обход процедуры командой jmp; - в другом модуле. Синтаксис описания процедуры: Имя_процедуры PROC заголовок Команды, директивы тело процедуры [ ret ] возврат из процедуры [имя_процедуры] ENDP конец процедуры Вызов процедуры осуществляется командой CALL [модификатор] имя_процедуры Команда call передает управление по адресу с символическим адресом имя_процедуры, с сохранением в стеке адреса возврата, команды следующей после команды call. Возврат из процедуры осуществляется по команде RET [число] Команда ret считывает адрес возврата из стека и загружает его в регистры cs и ip/eip, возвращая таким образом управление команде, следующей за командой call. Число – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры. Размер элемента зависит от используемой модели сегментации 32 или 16 разрядной. Передача аргументов из/в процедуру может осуществляться через регистры, переменные или стек.
Пример .
Макрокоманда является одним из многих механизмов замены текста программы. С помощью макрокоманды в текст программы можно вставлять последовательности строк и привязывать их к месту вставки. Макрокоманда представляет собой строку, содержащую некоторое имя – имя макрокоманды, предназначенное для того, чтобы быть замещенным одной или несколькими другими строками при трансляции. Для работы с макрокомандой вначале необходимо задать ее шаблон-описание, так называемое макроопределение. Имя_макрокоманды MACRO [список_формальных_аргументов] <Тело макроопределения> ENDM Существует три варианта расположения макроопределений: - в начале исходного текста программы до сегмента кода и данных с тем, чтобы не ухудшать читабельность программы. В данном случае макрокоманды будут актуальны только в пределах этой программы; - в отдельном файле. Для того, чтобы использовать эти макроопределения в других программах, необходимо в начале исходного текста этих программ записать директиву include имя_файла - в макробиблиотеке. Макробиблиотека создается в том случае, когда написанные макросы используются практически во всех программах. Подключается библиотека директивой include. Недостаток этого и предыдущего методов в том, что в исходный текст программы включаются абсолютно все макроопределения. Для исправления ситуации можно использовать директиву purge, в качестве операндов которой перечисляются макрокоманды, которые не должны включаться в текст программы. Include macrobibl.inc ;в исходный текст программы будут вставлены строки из macrobibl.inc Purge outstr, exit ;за исключением макроопределений outstr, exit
Активизация макроса осуществляется следующим образом: Имя_макрокоманды список_ фактических_ аргументов
Функционально макроопределения похожи на процедуры. Сходство их в том, что и те, и другие достаточно один раз где-то описать, а затем вызывать их специальным образом. На этом их сходство заканчивается, и начинаются различия, которые в зависимости от целевой установки можно рассматривать и как достоинства и как недостатки: - в отличие от процедуры, текст которой неизменен, макроопределение в процессе макрогенерации может меняться в соответствии с набором фактических параметров. При этом коррекции могут подвергаться как операнды команд, так и сами команды. Процедуры в этом отношении объекты менее гибки; - при каждом вызове макрокоманды ее текст в виде макрорасширения вставляется в программу. При вызове процедуры микропроцессор осуществляет передачу управления на начало процедуры, находящейся в некоторой области памяти в одном экземпляре. Код в этом случае получается более компактным, хотя быстродействие несколько снижается за счет необходимости осуществления переходов. Пример 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
Популярное: Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (172)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |