正文

汇编程序要注意中断捣鬼---进入死循环   小心啊2005-09-15 12:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/niao0311/4789.html

分享到:

取堆栈中的PC值一般采用2种方法:1.利用PUSH/POP;.........................XXXXH:   lcall  _getPC;YYYYH:   ;................等效为:PUSH  low  YYYYH ;先压入低8位地址,SP+1PUSH  high YYYYH ;后压入高8位地址,SP+1JMP   _getPC;跳入_getPC后遇到RET返回YYYYH_getPC:  pop DPTH ;先弹出高8位地址,SP-1         pop DPTL ;后弹出低8位地址,SP-1;...................................;        假设此处立即响应某中断;...................................ZZZZH:         INC SP   ;恢复低8位地址low  YYYYH         INC SP   ;恢复高8位地址high YYYYH;...................................;...................................         RET      ;返回YYYYH        但若在第1个INC SP前来中断时,则由于2个POP和中断的2个PUSH将使原栈顶存入的返回地址YYYYH被中断返回地址ZZZZH覆盖!!! 以上程序等效为:;.........................XXXXH:   lcall  _getPC;YYYYH:   ;................等效为:PUSH  low  YYYYH ;先压入低8位地址,SP+1PUSH  high YYYYH ;后压入高8位地址,SP+1JMP   _getPC;跳入_getPC后遇到RET返回YYYYH_getPC:  POP DPTH ;先弹出高8位地址YYYYH,SP-1         POP DPTL ;后弹出低8位地址YYYYH,SP-1;...................................;        假设此处立即响应某中断(INT0)         PUSH  low  ZZZZH;覆盖YYYYH!!!,SP+1         PUSH  high ZZZZH;覆盖YYYYH!!!,SP+1         JMP   0x0003;跳入INT0_ISR;遇RETI返回ZZZZH,且SP-2;...................................ZZZZH:         INC SP   ;恢复低8位地址low  ZZZZH         INC SP   ;恢复高8位地址high ZZZZH;...................................;...................................         RET      ;返回ZZZZH;哈哈,等效为SP-2,JMP ZZZZH结果很震惊---死循环!!!!!!!!!!!!!!!!!!!!!!!!!!!所以,这种方法要特别注意!!!---也是一种中断如何"伤人"的案例.2.利用SP,@R0;.........................XXXXH:   lcall  _getPC;YYYYH:   ;................_getPC:  MOV  R0,SP;取SP是安全的         MOV  DPTH, @R0;先弹出高8位地址YYYYH         DEC  R0         MOV  DPTL, @R0;再弹出低8位地址YYYYH..............................................         RET这种方法不受中断的影响,因为用户没有操作SP(没改变其值)...

阅读(2954) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册