新闻  |   论坛  |   博客  |   在线研讨会
汇编数组的C++和COM的两种实现方式
0750long | 2009-06-03 11:01:17    阅读:1238   发布文章

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

 
 

下午求助了几位年轻的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);
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客