CALL_NODA, B ; наглядное обращение к ПП с параметрами.
mov CX, AX ; (CX) = NOD(A,B) CALL_NOD C, D ; (AX) = NOD(C,D) add CX, AX ; (CX) = NOD(A,B) + NOD(C,D) Использование меток в макросах. Пример 1. Если в макроопределении используются метки, но нетдирективы Local , то после макрогенерации будет сообщение обошибке – дублирование меток: Вычислить остаток от деления одного числа на другое с помощью вычитания (числа натуральные, r1 и r2 - регистры). MD Macro r1, r2 ; r1 = r1 mod r2 Local M, M1 M: cmp r1, r2 ; while r1 >= r2 DO r1 = r1 – r2 Jb M1 Sub r1, r2 Jmp M M1: Endm Обращения к макросу MD: (r1 = AX, r2 = BX) ----------------- MD AX, BX ??0000 : cmp AX, BX Jb ?? 0001 Sub AX, BX Jmp ?? 0000 ??0001: ---------------- 2) MD CX, DX ; (r1 = CX, r2 = DX) --------------------- ??0002 : cmp CX, DX Jb ??0003 Sub CX, DX Jmp ??0002 ??0003: --------------------- Макрогенератор, встретив директиву LocalM, M1, будет заменять метки M и M1 на специальные имена вида ??хххх, где хххх – четырехзначное 16-ричное число от 0000÷FFFF. Директивы условного ассемблирования (ДУА). ДУА управляют процессом ассемблирования путем подключения илиотключения фрагментов исходного текста программы. Общий вид: 1) if<выражение> If- часть [ else else-часть ] Endif 2) if <выражение > If-часть elseif<выражение 1> Elseif-часть 1 elseif<выражение 2> Elseif-часть 2 ------------------------------- [ else else-часть ] Endif ДУА в форме 2) используется аналогично операторам выбора в языках высокого уровня. ДУА много, рассмотрим некоторые из них: 1) if<константное выражение>if-часть if-часть ассемблируется, включается в исходный текст программы, если значение выражения - истина, т.е. не равно нулю, в противном случае работает else-часть, если она есть, если else-части нет, выполняется следующий за директивой if оператор. А) ife константное выражение В) elseife константное выражение if-часть работает, если выражение ложно, равно нулю. 3) a) ifdefметка ; if-часть работает, если b) elseifdef метка ; указанная метка определена 4) a) ifndefметка ; if-часть работает, если b) elseifndef метка ; указанная метка не определена 5) a) ifb<аргумент> ; if-часть работает, если b) elseifb<аргумент> ; значением аргумента является пробел 6) a) ifnb<аргумент> ; if-часть работает, если значением b) ifnb<аргумент> ; аргумента является не пробел 7) a) ifdif<арг1>, <арг2> ; b) elseifdif<арг1>, <арг2>; if-часть работает, если аргументы различны, прописные и строчные буквы различаются 8) a) ifdifi<арг1>, <арг2> b) elseifdifi<арг1>, <арг2> if-часть работает, если аргументы различны, прописные и строчные буквы не различаются 9) a) ifidn<арг1>, <арг2> b) elseifidn<арг1>, <арг2> if-часть работает, если аргументы одинаковы, прописные и строчные буквы различаются 10) a) ifidni<арг1>, <арг2> b) elseifidni<арг1>, <арг2> if-часть работает, если аргументы одинаковы, прописные и строчные буквы не различаются Здесь угловые скобки обязательны. Примеры использования ДУА 1) Использование ДУА непосредственно в Ассемблере. При отладке большой программы обычно используются отладочные печати для проверки правильности работы отдельных ее участков. В отлаженной программе эти печати удаляются. Но если отладка выполняется в несколько этапов, то добавлять печати в программу и исключать их – это тоже громоздкая работа, во время которой можно внести новые ошибки. Используя ДУА, задачу включения в исходный текст программы и исключения из нее отладочных печатей перекладываем на макрогенератор, а он не ошибается. Для этого программисту нужно определить константу, установив таким образом режим отладки или счета. Например, DebugEQU 1 - отладка, debugEQU 0 - счет А в программе должно быть: movx, AX If debug OutInt x Endif Mov BX, 0 После макрогенерации в программе появится текст если debug <> 0: mov x, AXесли debug = 0: mov x, AX OutInt x mov BX, 0 mov BX, 0 Здесь OutInt – макрокоманда обращения к процедуре вывода. Решить задачу, чтобы отладочная печать работала в режиме отладки и не работала при счете, можно и с помощью команды сравнения и условного перехода: mov x, AX mov CL, debug cmp CL, 1 jne L OutInt x L: movBX, 0 ---------------------------- Однако, этот текст всегда будет занимать место в памяти и, если такихучастков будет много, то исходный текст будет громоздким и времявыполнения программы будет существенно больше. При использовании условной генерации время тратится только на этапе ассемблирования. При счете этих операций в исходном тексте не будет.
Популярное: Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (555)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |