打印

为何传递函数指针后,会出问题?难道是汇编器的问题?

[复制链接]
3024|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zealane|  楼主 | 2008-7-9 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主函数中调用:
Msg_Register(InkeyTest_MsgProc, Msg_Key0,Msg_Key1);//InkeyTest_MsgProc是Msg处理函数

//---------------------------------------------
//消息处理程序的登记
//入口:消息字,函数指针
//开始消息字和结束消息字之间的处理函数指针设置
//---------------------------------------------
void Msg_Register(void(* Function)(), const unsigned char mEnumMin, const unsigned char mEnumMax)
{
    unsigned char min=mEnumMin;
    unsigned char max=mEnumMax;
    unsigned char i;
    while(min<=max)
    {
            sInMsg.aMessage_Function[min++]=Function;
    }
}
上面的子函数汇编后是这样的:
void Msg_Register(void(* Function)(), const unsigned char mEnumMin, const unsigned char mEnumMax) 

3F8427      Msg_Register:
3F8427 FE06 ADDB    SP,#6
3F8428 9744 MOV     *-SP[4],AH
3F8429 9643 MOV     *-SP[3],AL
3F842A A842 MOVL    *-SP[2],XAR4
    unsigned char min=mEnumMin; 
    3F842B 9243 MOV     AL,*-SP[3]
    3F842C 9645 MOV     *-SP[5],AL
    unsigned char max=mEnumMax; 
    3F842D 9244 MOV     AL,*-SP[4]
    3F842E 9646 MOV     *-SP[6],AL
    unsigned char i; 
  //  for(i=min;i<=max;i++) 
    while(min<=max) 
    3F842F 6F0C SB      DW$L$_Msg_Register$2$E,UNC
    3F843B      DW$L$_Msg_Register$2$E:
    3F843B 9246 MOV     AL,*-SP[6]
    3F843C 5445 CMP     AL,*-SP[5]
    3F843D 67F3 SB      DW$L$_Msg_Register$2$B,HIS
    { 
            sInMsg.aMessage_Function[min++]=Function; 
            3F8430      DW$L$_Msg_Register$2$B:
            3F8430 761F MOVW    DP,#0x0203
            3F8432 9345 MOV     AH,*-SP[5]
            3F8433 C400 MOVL    XAR6,@0
            3F8434 0EA8 MOVU    ACC,@AH
            3F8435 0A45 INC     *-SP[5]
            3F8436 FF30 LSL     ACC,1
            3F8437 07A6 ADDL    ACC,@XAR6
            3F8438 8AA9 MOVL    XAR4,@ACC
            3F8439 C442 MOVL    XAR6,*-SP[2]
            3F843A C2C4 MOVL    *+XAR4[0],XAR6
    } 

3F843E      DW$L$_Msg_Register$3$E:
3F843E FE86 SUBB    SP,#6
3F843F 0006 LRETR   
 
//=============================================== 
当min=3时进入循环体运行到3F843A C2C4 MOVL    *+XAR4[0],XAR6处,栈里的min和max就改变了,min成了3f,max 成了838C(3f838c是XAR6寄存器的内容。)也就是将XAR6的数据移到*+XAR4[0],却改变了min和max的值。

百思不得其解。不知何故?




sInMsg结构体是这样的:
struct InMsg{
    void (**aMessage_Function)();        //对应消息字的函数指针数组开始指针
    unsigned char *aMsgBufStart;            //消息缓冲区开始
    unsigned char *aMsgBufEnd;            //消息缓冲区结束位置
    unsigned char *pMsgIn;
    unsigned char *pMsgOut;
    unsigned char aReadMsgBuffer[5];        //用户使用的消息信息缓冲区,只读[0]消息字,[1]-[4]为参数
};
struct InMsg sInMsg;

相关帖子

沙发
zealane|  楼主 | 2008-7-9 10:08 | 只看该作者

上面改自所长的教程,呵呵。

移植到dsp还是有一丁点麻烦啊。。。。。

使用特权

评论回复
板凳
TI_CPIC| | 2008-7-9 17:12 | 只看该作者

楼主用的是哪一个型号?


楼主用的是哪一个型号?另外请提供Function函数具体内容~~

使用特权

评论回复
地板
hotpower| | 2008-7-9 20:16 | 只看该作者

aMessage_Function需要分配足够的空间

好的编译器是会警告aMessage_Function没有初始化

使用特权

评论回复
5
zealane|  楼主 | 2008-7-9 20:50 | 只看该作者

re

aMessage_Function需要分配足够的空间
==================================
hot大叔就是hot大叔。

是不是由于aMessage_Function没有初始化,而aMessage_Function默认是0x0000,栈的地址是从0x00000000开始的,所以栈里内容会异常?

使用特权

评论回复
6
hotpower| | 2008-7-9 22:56 | 只看该作者

这实际是个函数指针数组的问题

自己再看看,俺要回村了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

249

帖子

1

粉丝