如何拉回的?利用C51编译器对中断的支持特点:
void extern_ISR_X(void) interrupt X{}
C51编译器给这段中断定义分配一个中断向量X,它的地址在X*8+3。X的取值从0-31,因为8051的中断向量表最大为0xff,可以计算一下:31*8+3=0xfb。你若设置X=32,就有编译警告:OUT OF ...范围。
因此,用户可以利用这种方法在程序正常轨道之外的固定位置挖掘32个陷阱!位置:0x03,0x0B,0x13,0x1b,0x23,0x2b,......0xf3,0xfb。每个陷阱里有一条RETI语句!这是这条语句的特殊性把掉入陷阱的异常程序拉回了SP堆栈指针所指向的原本正常程序的轨道位置点,异常程序被修正从这一点重新开始运行了。 |