TI中文支持网
TI专业的中文技术问题搜集分享网站

关于MSP430混合编程时出现的问题,求解决分析

用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   /*启动标志*/

赞(0)
未经允许不得转载:TI中文支持网 » 关于MSP430混合编程时出现的问题,求解决分析
分享到: 更多 (0)