Pdp11:MARK - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

instruction ===Instruction===MARK ===Code===0064NN ===Operation===SP ← SP + 2 * NN
PC ← R5
R5 ← (SP)↑ ===Coden===无影响 ===Codez===无影响 ===Codev===无影响 ===Codec===无影响 ===Description===标记退栈位置,方便子程序返回时的退栈操作
详见实例 ===Example===进入子程序前进行如下操作保护现场:

指令 说明
MOV R5 , -(SP) 旧R5入栈,为方便区分,标记为R5[0]
MOV P1 , -(SP)
...
MOV PN , -(SP) 共传入N个参数
MOV #MARKN , -(SP) MARK N指令编码 [如0064NN]入栈,方便以后执行
MOV SP , R5 标记SP为SP[0],标记R5为R5[1] (= SP[0])
JSR PC , SUB 转入子程序,标记当前PC为PC[0],PC[0]入栈
此时,堆栈状态为


子程序代码:
指令 说明
SUB:
...
RTS R5 子程序返回,恢复现场
恢复现场的执行步骤:
  1. RTS操作:
    PC = R5[1] = SP[0]
    R5 = PC[0]
  2. 由于PC指向SP[0],使执行的操作为MARK N
    MARK N的操作:
    从堆栈退出所有参数(SP ← SP + 2 * NN)
    PC = R5 = PC[0]
    R5 = R5[0]
  3. 现场恢复完毕,运用MARK N达到从堆栈方便地退出所有参数的目的
⚠️ **GitHub.com Fallback** ⚠️