Turbo Assembler 3.0. Руководство пользователя

         

Определение вложенных и рекурсивных макрокоманд


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

MCREATE MACRO opname, op1,op2,op3,op4,op5,op6,op7 IFNB opname DO & opname MACRO op,count IF count LE 4 REPT count opname op,1 ENDM ELSE MOVE CL,count opname op,CL ENDIF EMDM ; конец DOopname MCREATE op1,op2,op3,op4,op5,op6,op7 ; рекурсия! ENDIF ; конец if ENDM ; конец макрокоманды MCREATE

После вызова:

MCREATE ror,rol,rcl,rcr,shl,sal,sar

будут созданы дополнительные макрокоманды DOror, DOrol и т.д., которые можно использовать следующим образом:

DOshr ax,5 DOrcr bx,3

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

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

PUSH MACRO r1,r2,r3,r4,r5,r6,r7,r8 IFNB r1 PUSH r1 PUSH r2,r3,r4,r5,r6,r7,r8 ENDIF ENDM



Содержание раздела