原创 菜农正式发布“汇编数组”完整版前再晕大家一次(不晕做中队长)

2009-3-3 18:44 2706 3 3 分类: MCU/ 嵌入式
HotC51 发表于 2009-3-3 18:39 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 菜农正式发布“汇编数组”完整版前再晕大家一次(不晕做中队长)


/*---------------------------------------------
    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二次)
};

HotC51 发表于 2009-3-3 18:41 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: “汇编数组”以后被移植到其他MCU/DSP甚至PC,可能是个祸害~~~


俺很担心~~~因为它太凶猛~~~

HotC51 发表于 2009-3-3 18:42 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

3楼: main.c


#include "hottask51.h"

void TimerISR2() interrupt TF2_VECTOR using 3
{
    TF2 = 0;
    _nop_();
    _nop_();
    _nop_();
}

void UserISR0f() interrupt 0x0f using 3
{
    _nop_();
    _nop_();
    _nop_();
}

void UserISR1f() interrupt 0x1F using 3
{//所有非法软中断被拦截到此~~~
    _nop_();
    _nop_();
    _nop_();
}


void main()
{
    comFunction.Vtbl.STARTex();

    comFunction.Vtbl.START();
    comFunction.Vtbl.ISR(TF2_VECTOR);//软中断到Timer2Isr()
    comFunction.Vtbl.ISR(0x1f);//软中断0x1f
    comFunction.Vtbl.ISR(0x20);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x30);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x40);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x50);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x60);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x70);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x80);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0x90);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0xa0);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0xb0);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0xc0);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0xd0);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0xe0);//非法软中断被拦截到0x0f
    comFunction.Vtbl.ISR(0xff);//非法软中断被拦截到0x0f

    comFunction.Vtbl.TEST();
    comFunction.Vtbl.RESET();//软件复位
    while(1);//永远不能执行!!!
}

HotC51 发表于 2009-3-3 18:46 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

4楼: 这些程序都用了“反逆向工程”技术~~~和反汇编说声“拜拜”了~
PARTNER CONTENT

文章评论0条评论)

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