单片机中,中断返回地址是保存在返回前的堆栈栈顶前两个单元中,中断返回时,PC(15-8)=SP,PC(7-0)=SP-1,只要改变两个单元的值就可以改变返回地址了。举例说明:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP EXT0
ORG 0030H
MAIN:
SETB EX0
SETB IT0
SETB EA
LOOP:
MOV P0,#5AH
SJMP LOOP
LOOP1: ;正常情况下,程序执行不到这里,通过修改返回地址,可以测试到这里
MOV P0,#0A5
SJMP LOOP1
EXT0: ;外部中断0,用于测试返回地址的改变
MOV DPTR,#LOOP1
POP ACC ;弹出保存的地址,丢掉
POP ACC
PUSH DPL ;压入准备返回的地址
PUSH DPH
RETI
END