采用宏定义的方法实现高级语言内嵌汇编编程
例如:
#define EnableInterrupts—asm CLl;
当然也可以用一个定义包含多条汇编指令:
#define INIT—SP—FROM—STARTUP—DESC()一asm LDHX@一SEG—END—ssTAcK一asm TXS;
对于多条汇编指令,为了增强可读性,可以将指令写成多行,除最后一行外,都要加“\”续行符号:
#define INIT _SP_FROM_STARTUP_DESC()_asm LDHX@_SED_SSTACK;\_asm TXS;
内嵌宏汇编中也可以携带参数。
#define Clear(wr)一asm CLR var;
如果内嵌宏汇编中包含有立即数操作符号“#”,则需要在前面使用#pragma N0—STRING—CONSTR指令。
如果内嵌汇编中包含有标号,则宏被多次调用后,会导致相同的标号重复出现。此时可以使用“##"字符串连接符以便自动修改标号。例如:
/*以下代码将,src’指向的字符串内容复制到dest”指向的存储区,inst是该宏被调用的次数。这段代码需要根据具体的CPU和汇编语言修改后才能使用*/
#pragma NO_STRING_CONSTR
#define copyMacr02(src,dest,inst){\
asm LOAD@src,Re90;/*装载源地址*/\
asm LOAD@dest,Regl;/*装载目标地址*/\
asm CLR Re92:/*清传递作用的间址寄存器*/\
aSm lp##inst:LOADB(Re92,RegO);/*装载字节*/\
asm STOREB(Re92,Re91);/*存储*/\
asm ADD#1,Reg2;/*修改间址寄存器*/\
asm TST Re92;/*检查是否结束*/\
asm BNE lp##inst;}
对宏copyMacr02的调用如下:
copyMacr02(source2.destination2,1);
copyMacr02(source2.destination3,2);
该宏被展开后标号分别为lpl和lp2。
阅读更多请您关注: