汇编中如何用数据指针修改单片机中断返回地址
4个回答
展开全部
单片机中,中断返回地址是保存在返回前的堆栈栈顶前两个单元中,中断返回时,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
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
展开全部
MOV DPTR, #ADDR ;ADDR是强制返回的地址
POP A ;先弹出原堆栈中的地址
POP A ;保持堆栈平衡
PUSH DPL ;低8位入栈
PUSH DPH ;高8位入栈
RET ;强制返回到DPTR指向的地址
POP A ;先弹出原堆栈中的地址
POP A ;保持堆栈平衡
PUSH DPL ;低8位入栈
PUSH DPH ;高8位入栈
RET ;强制返回到DPTR指向的地址
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个因为有现场保护,所以你需要修改堆栈中的值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
需要帮你做设计吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询