保护断点,保护现场 ◆保存返回地址的方法:将返回地址(断点地址)保存到堆 栈中(入栈或压栈,返回主程序前从堆栈中取出上述 地址放回到指令计数器PC中(出栈或弹栈) 按照放回后的PC值,从程序存储器中取指令执行就返 回到主程序被中断了的地方,以继续执行主程序。 ◆保护现场的方法:将现场条件(寄存器的值)先推入 (PUSH)堆栈保存,然后再使用这些寄存器,返回主 程序前,使用POP指令恢复寄存器中的值 2919:1257
保护断点, 保护现场 保存返回地址的方法:将返回地址(断点地址)保存到堆 栈中(入栈或压栈), 返回主程序前从堆栈中取出上述 地址放回到指令计数器PC中(出栈或弹栈); 按照放回后的PC值, 从程序存储器中取指令执行就返 回到主程序被中断了的地方, 以继续执行主程序。 保护现场的方法: 将现场条件 (寄存器的值) 先推入 (PUSH) 堆栈保存, 然后再使用这些寄存器, 返回主 程序前, 使用POP指令恢复寄存器中的值。 29 19:12:57
堆栈区 ◆位置:内部存储器的一部分区域专门用于堆栈 ◆数据存取规则:后进先出( LIFO---Last In first out, 即最后存入的数据将被最先取出。 ◆堆栈指针SP:SP始终指向栈顶。SP+1孔入高地址 P指向栈顶→D ◆入栈操作:先SP+1→sP,指向栈顶sP1-分出栈司 的上一个空单元,然后把直接寻址 B 单元的内容压入SP所指的单元中。 A低地址 ◆出栈操作:先弹出栈顶内容到直接寻图436堆栈示意图 址单元,然后SP-1sP,形成新的 堆栈指针。 019:12:57
堆栈区 30 19:12:57 图4-36 堆栈示意图 入栈操作:先SP+1→SP,指向栈顶 的上一个空单元,然后把直接寻址 单元的内容压入SP所指的单元中。 出栈操作:先弹出栈顶内容到直接寻 址单元,然后SP- 1→SP,形成新的 堆栈指针。 SP-1 入栈后 出栈后 SP指向栈顶→ SP+1 位置:内部存储器的一部分区域专门用于堆栈 数据存取规则:后进先出(LIFO—Last In First Out), 即最后存入的数据将被最先取出。 堆栈指针SP:SP始终指向栈顶。 D
栈操作指令(2条)一只能直接寻址 PUSH addr; SP<SP+l,(SP)(addr8) POP addre8;(addr8)←(SP),SP←SP-1 分别完成两种堆栈操作:入栈(PUSI,出栈(POP)。 注意:PUSH指令和POP指令成对出现,并注意顺序。 ◇例: PUSH ACO;保护累加器ACC中内容 PUSH PSW;保护标志寄存器内容 ●。●。 ;执行其他程序 POP PSW;恢复标志寄存器内容 POP ACC;恢复累加器ACC中内容 该程序执行后,累加器ACC和PSW寄存器中的内容 可得到保护和正确的恢复 3119:12:57
栈操作指令 (2条) PUSH addr8 ; SP←SP+1, (SP)←(addr8) POP addr8 ; (addr8)← (SP) , SP←SP- 1 分别完成两种堆栈操作: 入栈 (PUSH), 出栈(POP) 。 注意:PUSH指令和POP指令成对出现,并注意顺序。 31 19:12:57 例: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 …… ;执行其他程序 POP PSW ;恢复标志寄存器内容 POP ACC ;恢复累加器ACC中内容 该程序执行后,累加器ACC和PSW寄存器中的内容 可得到保护和正确的恢复。 只能直接寻址
入栈出栈顺序错误会导致现场恢复错误 ◇正确: PUSH ACO;保护累加器ACC中内容 PUSH PSW;保护标志寄存器内容 执行其他程序 POP PSW;恢复标志寄存器内容 POP ACC;恢复累加器ACC中内容 ◇若为: PUSH ACO 出入栈规则 PUSH PSW 后进先出 其他程序 POP ACC POP PSW 则执行后,将使得ACC和PSW中的内容互换 19:12:57
入栈出栈顺序错误会导致现场恢复错误 若为: PUSH ACC PUSH PSW …… ;其他程序 POP ACC POP PSW 则执行后,将使得ACC和PSW中的内容互换。 32 19:12:57 正确: PUSH ACC ;保护累加器ACC中内容 PUSH PSW ;保护标志寄存器内容 …… ;执行其他程序 POP PSW ;恢复标志寄存器内容 POP ACC ;恢复累加器ACC中内容 出入栈规则: 后进先出
保护断点,保护现场举例 ◇假设长调用指令 LCALL Delay机器码:12H,11H,00在 1000H存储器单元,如图所示。 地址程序有储器 地址内部RAM ①PC→1000计12H| CALL Delay PC+1-1001mH设执行e前 SP) 07Hr7 PC+2→>1002H00H 3) ②现行PC103列PNW80H SP+1→>08H03H SP2→09H10H保护断点即下一指令地址 (ACCF70H 被调用子程 ⑤保护现场 SP3→>0AH80HPsw地址1101 USH PSW Delay 1100hlocoH SP+4>0BH 70H F-ACC 1102HOCOHPUSH ACC 保护现场 1103H0E0H6省略程序 堆栈区 104HODOHPOP ACC 105 HOEGH恢复现场 106HODOHPOP PSW 107HODOHI 保护断点,保护现场的执行过程示意图08H2HRET 19:12:58 1109H
保护断点, 保护现场 举例 假设长调用指令LCALL Delay (机器码: 12H, 11H, 00H)在 1000H存储器单元,如图所示。 33 19:12:58 保护断点, 保护现场的执行过程示意图 1000H 12H 1001H 11H 1002H 00H 1003H 返回后执行 代码 1100H0C0H 1101H0D0H 1102H0C0H 1103H 0E0H 1104H0D0H 1105H 0E0H 1106H0D0H 1107H0D0H 1108H 22H 1109H 地址 程序存储器 PC→ 现行PC 即下一指令地址 新PC← 07H R7 08H 09H 0AH 0BH SP+1→ SP→ PSW ACC SP+2→ SP+3→ SP+4→ PUSH ACC PUSH PSW RET 地址 内部RAM LCALL Delay Delay 地址 ① ③ ② ④ ⑤ ⑥ ⑤ ⑥ POP ACC POP PSW (ACC)=70H (PSW)=80H PC+1→ PC+2→ 保护断点 保护现场 保护现场 恢复现场 03H 10H 80H 70H 堆栈区 设执行delay前 被调用子程 省略程序