专栏中心

EEPW首页 > 专栏 > 汇编数组的C++和COM的两种实现方式

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

发布人:0750long 时间:2009-06-03 来源:工程师 发布文章
汇编数组的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);
}

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

日本巨头撤退:松下将把欧美电视销售业务转让给创维

阿斯麦将极紫外光刻机光源功率提升至1000瓦,助力提升芯片良率、降低制造成本

大嘴业话:互联网公司做机意欲何为

视频 2012-05-23

阿斯麦ASML公布EUV光源技术突破,2030年芯片产能或提升50%

超越工程本身:雅培工程师的核心技能如何影响生产力与职业发展

群联预警:2026 NAND闪存短缺将冲击消费电子产业

人形机器人开发新手入门完全指南

用硬件仿真器实现全面的验证

视频 2012-05-28

100GbE时代的网络处理器:BCM88030 XGSCore

视觉:嵌入式的下一个方向

破解电子系统散热难题:如何在热浪中保持性能稳定

三星晶圆代工本季度产能利用率飙升至 80%

EDA/PCB 2026-02-24

微型投影仪:视频分享时代的宠儿

视频 2012-05-28

仅1纳米、功耗最低!我国科研团队取得下一代芯片关键进展

EDA/PCB 2026-02-24

智驾仿真国产化提速:摩尔线程与五一视界共建全栈国产化的物理AI仿真体系

更多 培训课堂
更多 焦点
更多 视频

技术专区