用C和汇编分别编译后链接来进行混合编程的。我在C中使用指向指针的数组,存的是C中的某些参数的地址。然后调用汇编函数将数组的首地址传到汇编中,在汇编汇中将C中参数地址转移到寄存器中,这里用到了R4,R5,R6,R7,R8,R9.然后进行相关操作。相关代码如下
//C中的相关代码:指针变量和数组都已经定义为全局变量,相关变量都已初始化。
PFlagRegAddr = &PFlagReg; //PFlagReg地址
PStatusRegAddr = &PStatusReg; //PStatusReg地址
PStatusReg1Addr = &PStatusReg1; //PStatusReg1地址
PDetSensitivityAddr = &PDetSensitivity; //PDetSensitivity地址
PDetSensitivity1Addr = &PDetSensitivity1; //PDetSensitivity1地址
PStartupValueAddr = &PStartupValue; //PPStartupValue地址
PStartupValue1Addr = &PStartupValue1; //PPStartupValue1地址
unsigned char *PAddr[6] = {PStatusRegAddr,PStatusReg1Addr,PDetSensitivityAddr,PDetSensitivity1Addr,PStartupValueAddr,PStartupValue1Addr};
while(1)
{
Main_asm(PFlagRegAddr,PAddr); //进入汇编主程序
}
//C程序编译没有问题
//汇编相关程序
;—————————————————————
; 正常工作模式
;—————————————————————
Main_asm:;
mov.w 0(R13),R4;
mov.w 2(R13),R5;
mov.w 4(R13),R6;
mov.w 6(R13),R7;
mov.w 8(R13),R8;
mov.w 10(R13),R9;
…
L_Action1:;
cmp #BIT5+BIT4+BIT1+BIT0,0(R8); jeq L_Reset1;
bic.b #Relay_Reset1Pin,Relay_Reset1PinReg;
bis.b #Power_ControlPin,Power_ControlPinReg; bis.b #Relay_Action1Pin,Relay_Action1PinReg;
bis.b #PbStartupFlag,0(R5);
…
最后一个语句 bis.b #PbStartupFlag,0(R5); 编译时错误,提示illegal effective address
但是上面的 cmp #BIT5+BIT4+BIT1+BIT0,0(R8) 却没有错
不理解呀,求高手解决
灰小子:
在汇编中宏定义了PbStartupFlag;//PStartusReg各状态位定义;…#define PbStartupFlag BIT5 ;//启动标志…我把PbStartupFlag换成BIT5后,再次编译就能通过 照理说,PbStartupFlag和BIT5是等效的我又对R8进行了相似的替换;汇编宏定义…#define DetMode R8;…;汇编中的相应代码换成…L_Action1:; cmp #BIT5+BIT4+BIT1+BIT0,0(DetMode); jeq L_Reset1; bic.b #Relay_Reset1Pin,Relay_Reset1PinReg; bis.b #Power_ControlPin,Power_ControlPinReg; bis.b #Relay_Action1Pin,Relay_Action1PinReg; bis.b #BIT6,0(R5);这样编译也没错为何对于源操作数进行定义替换就会出现错误,而对目的操作数进行相同操作就不会出现问题我先前也写过几个C和汇编混合编程的代码 对源操作数进行替换后编译也没错,只有到这个程序才出现问题
Lichen Wang:
你在汇编代码中有PbStartupFlag的定义吗?
Lichen Wang:
回复 灰小子:
您的定义:
#define PbStartupFlag BIT5 ;//启动标志
红色部分不能用。如果你改变它,如下所示绿色部分,那么它应该工作。
#define PbStartupFlag BIT5 /*启动标志*/