原创 数组汇编之应用

2008-6-23 04:39 5109 5 5 分类: 处理器与DSP


工程师的收藏夹
200773055547196.gif




俺的地盘俺做主

1.中断向量表


#pragma DATA_SECTION("vectors")
uVectorEntry g_pfnVectors[32] = {
 ISR_Reset(),           //reset      0x0080 #0
 HotBIOS_ISR(Tsk_F_isr, 0, 1), //nmi        0x0084 #1
 HotBIOS_ISR(Tsk_F_isr, 0, 2), //sint17     0x0088 #2   
 HotBIOS_ISR(Tsk_F_isr, 0, 3), //sint18     0x008c #3
 HotBIOS_ISR(Tsk_F_isr, 0, 4), //sint19     0x0090 #4
 HotBIOS_ISR(Tsk_F_isr, 0, 5), //sint20     0x0094 #5
 HotBIOS_ISR(Tsk_F_isr, 0, 6), //sint21     0x0098 #6
 HotBIOS_ISR(Tsk_F_isr, 0, 7), //sint22     0x009c #7
 HotBIOS_ISR(Tsk_F_isr, 0, 8), //sint23     0x00a0 #8
 HotBIOS_ISR(Tsk_F_isr, 0, 9), //sint24     0x00a4 #9
 HotBIOS_ISR(Tsk_F_isr, 0,10), //sint25     0x00a8 #10
 HotBIOS_ISR(Tsk_F_isr, 0,11), //sint26     0x00ac #11
 HotBIOS_ISR(Tsk_F_isr, 0,12), //sint27     0x00b0 #12
 HotBIOS_ISR(Tsk_F_isr, 0,13), //sint28     0x00b4 #13
 HotBIOS_ISR(Tsk_F_isr, 0,14), //sint29     0x00b8 #14
 HotBIOS_ISR(Tsk_F_isr, 0,15), //sint30     0x00bc #15
 HotBIOS_ISR(Tsk_F_isr, 0,16), //int0       0x00c0 #16
 HotBIOS_ISR(Tsk_F_isr, 0,17), //int1       0x00c4 #17
 HotBIOS_ISR(Tsk_F_isr, 0,18), //int2       0x00c8 #18
 HotBIOS_ISR(Tsk_F_isr, 0,19), //tint       0x00cc #19
 HotBIOS_ISR(Tsk_F_isr, 0,20), //rint0      0x00d0 #20
 HotBIOS_ISR(Tsk_F_isr, 0,21), //xint0      0x00d4 #21
 HotBIOS_ISR(Tsk_F_isr, 0,22), //rint1      0x00d8 #22
 HotBIOS_ISR(Tsk_F_isr, 0,23), //xint1      0x00dc #23
 HotBIOS_ISR(Tsk_F_isr, 0,24), //int3       0x00e0 #24
 HotBIOS_ISR(Tsk_F_isr, 0,25), //hpint      0x00e4 #25
 HotBIOS_ISR(Tsk_F_isr, 0,26), //           0x00e8 #26
 HotBIOS_ISR(Tsk_F_isr, 0,27), //           0x00ec #27
 HotBIOS_ISR(Tsk_F_isr, 0,28), //           0x00f0 #28
 HotBIOS_ISR(Tsk_F_isr, 0,29), //           0x00f4 #29
 HotBIOS_ISR(Tsk_F_isr, 0,30), //           0x00f8 #30
 HotBIOS_ISR(Tsk_F_isr, 0,31) //           0x00fc #31
};


#define ISR_Reset()   {\
                      ASMCodeArrayAEx(ASMCODE_BD_K, (pfnVectorEntry)c_int00),\
                      ASMCodeArrayEx(ASMCODE_LD_K_SP, 0x200u)\
                      }


#define ISR_Return()  {\
                        ASMCode16i(ASMCODE_RETE),\
                        ASMCode16((pfnVectorEntry)ASMCODE_NOP),\
                        ASMCode16i(ASMCODE_NOP),\
                        ASMCode16i(ASMCODE_NOP)\
                      }


#define ISR_Default() {\
                        ASMCodeArrayAEx(ASMCODE_BD_K, (pfnVectorEntry)DefaultIsr),\
                        ASMCode16i(ASMCODE_NOP),\
                        ASMCode16i(ASMCODE_NOP)\
                      }
#define ISR(addr)     {\
                        ASMCodeArrayAEx(ASMCODE_BD_K, (pfnVectorEntry)addr),\
                        ASMCode16i(ASMCODE_NOP),\
                        ASMCode16i(ASMCODE_NOP)\
                      }
2.数组汇编


/*------------------------------------------------------------------------*/
typedef void (*ASMCodeArray_FPtr)(void);//定义数组可执行汇编的函数指针


int main(void)
{
HotBIOS_State iState;
TI_IREG AsmCodeArray_IsrFunction[]=//汇编数组首地址实际为汇编入口地址
{//下面的"数据"实际为汇编代码
 ASMCode16i(ASMCODE_POPM_A),//psha
// ASMCodeArrayEx(ASMCODE_B_K, Tsk_F_isr),//b Tsk_F_isr  
    __asm_goto__(Tsk_F_isr),
 ASMCodeArray(ASMCODE_LD_k_A, 0x01u),//ld #1, a  
};
TI_IREG AsmCodeArray_Function[]=//汇编数组首地址实际为汇编入口地址
{//下面的"数据"实际为汇编代码
 ASMCode16i(ASMCODE_PSHM_A),//psha
//bd xxxh ->loop
// ASMCodeArrayEx(ASMCODE_BD_K, &AsmCodeArray_IsrFunction[1]),//bd AsmCodeArray_IsrFunction  



// ASMCodeArrayEx(ASMCODE_B_K, &AsmCodeArray_IsrFunction[1]),//bd AsmCodeArray_IsrFunction  
    __asm_goto__(&AsmCodeArray_IsrFunction[1]),
 ASMCodeArray(ASMCODE_LD_k_A, 0x01u),//ld #1, a  
};


//声明函数指针ASMCodeExec来实际运行数组内的汇编代码


ASMCodeArray_FPtr ASMCodeExec = (ASMCodeArray_FPtr)AsmCodeArray_Function;
 ASMCodeExec();//调用数组内的汇编代码


3.在MCU/ARM/DSP上实现动态链接


哈哈~~数组要比代码好管理(删除,移动,变换,加密等等)的多~~~


点击看大图


 



工程师的收藏夹
200773055547196.gif




俺的地盘俺做主
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条