打印

dsp54x下汇编数组的C++和COM的两种实现方式

[复制链接]
2083|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2008-6-26 01:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
hotpower 发表于 2008-6-25 23:09 侃单片机 ←返回版面    

25楼: 程序所能访问的任意区域~~~真有事求助IceAge老师~~~ 

下午求助了几位年轻的C++村民:

我用C++和COM都出现了数据指针和函数指针不规范或不标准转换的警告.

在VC++下没问题,但在DSP的CCS3.1环境下就出现了警告.
我用所有C++或C的强制转换都未果,甚至用中间变量折腾一次也不行~~~

H文件:
typedef long HRESULT;
typedef interface IHotAsmArrayCom IHotAsmArrayCom;

typedef struct IHotAsmArrayComVtbl
{
    void (*comASMArray)(void);//定义数组可执行汇编的函数指针
    int  (*comintASMArray)(void);//定义数组可执行汇编的函数指针
    void (*comASMArrayInt)(int);//定义数组可执行汇编的函数指针
    int  (*comintASMArrayInt)(int);//定义数组可执行汇编的函数指针
}IHotAsmArrayComVtbl;

interface IHotAsmArrayCom
{
    struct IHotAsmArrayComVtbl *lpVtbl;
};

extern void HotCOMDemo(void);

C文件:
void HotCOMDemo(void)
{
TI_IREG __ASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG __intASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG __ASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG __intASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_push__(ASMCODE_REGS_AR6),
    __asm_push__(ASMCODE_REGS_AR7),
    __asm_frame__(-15),
    __asm_char_SetACC__(0x88),
    __asm_frame__(15),
    __asm_pop__(ASMCODE_REGS_AR7),
    __asm_pop__(ASMCODE_REGS_AR6),
    __asm_return__(),
};

TI_IREG result, parameter = 0x1234;
//申请COM接口指针
IHotAsmArrayCom *AsmArrayCom = new (IHotAsmArrayCom*)[sizeof(IHotAsmArrayCom)];
//挂接汇编数组代码到COM接口
    AsmArrayCom->lpVtbl->comASMArray = (ASMCodeArray_FPtr)__ASMCodeArray;
    AsmArrayCom->lpVtbl->comintASMArray = (intASMCodeArray_FPtr)__intASMCodeArray;
    AsmArrayCom->lpVtbl->comASMArrayInt = (ASMCodeArrayInt_FPtr)__ASMCodeArrayInt;
    AsmArrayCom->lpVtbl->comintASMArrayInt = (intASMCodeArrayInt_FPtr)__intASMCodeArrayInt;
//通过COM访问汇编数组中的汇编代码
    AsmArrayCom->lpVtbl->comASMArray();
    result = AsmArrayCom->lpVtbl->comintASMArray();
    AsmArrayCom->lpVtbl->comASMArrayInt(0x1234);
    result = AsmArrayCom->lpVtbl->comintASMArrayInt(0x1234);
    delete AsmArrayCom;
}


再一种:

H文件:
typedef void (*ASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针
typedef int (*intASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针
typedef void (*ASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针
typedef int (*intASMCodeArrayInt_FPtr)(int);//定义数组可执行汇编的函数指针
extern void HotASMDemo(void);

C文件:

void ASMObj::ArrayProcess(ASMCodeArray_FPtr process)
{
    process();//
}


__TI_IREG ASMObj::ArrayFunction(intASMCodeArray_FPtr function)
{
    return function(); 
}


void ASMObj::ArrayProcess(ASMCodeArrayInt_FPtr process, __TI_IREG arg)
{
    process(arg);//
}


__TI_IREG ASMObj::ArrayFunction(intASMCodeArrayInt_FPtr function, __TI_IREG arg)
{
    return function(arg); 
}


void HotASMDemo(void)
{
TI_IREG __ASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_pushACC__(),
    __asm_char_SetACC__(0x88),
    __asm_popACC__(),
    __asm_return__(),
};

TI_IREG __intASMCodeArray[]=
{//下面的"数据"实际为汇编代码
    __asm_char_SetACC__(0x88),
    __asm_return__(),
};

TI_IREG __ASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_char_SetACC__(0x88),
    __asm_return__(),
};

TI_IREG __intASMCodeArrayInt[]=
{//下面的"数据"实际为汇编代码
    __asm_char_SetACC__(0x88),
    __asm_return__(),
};

TI_IREG result, parameter = 0x1234;
    ASM.ArrayProcess((ASMCodeArray_FPtr)(__ASMCodeArray));
    result = ASM.ArrayFunction((intASMCodeArray_FPtr)__intASMCodeArray);
    ASM.ArrayProcess((ASMCodeArrayInt_FPtr)__ASMCodeArrayInt, parameter);
    result = ASM.ArrayFunction((intASMCodeArrayInt_FPtr)__intASMCodeArrayInt, parameter);
}




都是一样~~~

我想是CCS太聪明了~~~
 
 

相关帖子

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

本版积分规则

1460

主题

21619

帖子

506

粉丝