/*--------------------------------------------- HotTask51软中断函数 void __HotASM_ISR__(unsigned char isrNum) 入口: R7 D4D3 中断向量组号 D2D1D0 中断向量号 出口: R7 isrNum 结果: 跳入对应的中断地址 isrNum * 8 + 3 -----------------------------------------------*/ HotASM (__HotASM_ISR__)//(unsigned char isrNum) {//DPTR保存的是汇编数组函数的首地址__HotASM_ISR__ #define lable__HotASM_ISR__Error (-(size_CPL_C() + size_MOV_A() + size_JNC())) asm_CJNE_R7(0x20, size_CPL_C() +size_MOV_A() - 1),//mov a,R7 //lable__HotASM_ISR__Error: asm_CPL_C(), asm_MOV_A(0xEF),//mov a,0xef// asm_JNC(lable__HotASM_ISR__Error),//非法软中断号>(0~0x1f) asm_RL_A(), asm_RL_A(), asm_RL_A(), asm_ORL_A(0x03), asm_CLR_ACC_2(), asm_PUSH_ACC(),//压入中断地址低8位 asm_CLR_A(), asm_PUSH_ACC(),//压入中断地址高8位 asm_RET()//跳入对应的中断地址 isrNum * 8 + 3 };
/*--------------------------------------------- HotTask51系统启动函数(直接操作SP) void __HotASM_STARTex__(void) 入口: 无 Keil DPTR = &__HotASM_STARTex__[0] R2R1 = DPTR 出口: 无 结果: 一次RETI后继续执行 特点: 本“函数”可以“动态加载” -----------------------------------------------*/ HotASM (__HotASM_STARTex__)//(void) {//DPTR保存的是汇编数组函数的首地址__HotASM_START__ #define lable__HotASM_STARTex__Exit (20 + size_JMP_DPTR() + size_DW()) asm_CLR_A(), asm_MOV_IE_A(),//关中断 /*------------------------------------------------------------------------ 注意下列方法和__HotASM_START__的最大不同之处和更为凶猛的方法~~~ --------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/ asm_INC_SP(), asm_MOV_R0_SP(),//准备搞破坏 asm_INC_SP(), asm_MOV_A_DPL(), asm_ADD_A(lable__HotASM_STARTex__Exit),//lable__HotASM_RESET__0 asm_MOV_iR0_A(),//装入lable__HotASM_STARTEx__Exit低8位 asm_INC_R0(), asm_MOV_A_DPH(), asm_ADDC_A(0), asm_MOV_iR0_A(),//20//装入lable__HotASM_STARTEx__Exit高8位 /*-----------------------------------------------------------------------*/ asm_JMP_DPTR(lable__HotASM_STARTex__Exit), //NOP asm_DW(0x55aa), //lable__HotASM_STARTEx__Exit: asm_RETI()//(调用RETI二次) };
|