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 | 子程序返回,恢复现场 |
- RTS操作:
PC = R5[1] = SP[0]
R5 = PC[0] - 由于PC指向SP[0],使执行的操作为MARK N
MARK N的操作:
从堆栈退出所有参数(SP ← SP + 2 * NN)
PC = R5 = PC[0]
R5 = R5[0] - 现场恢复完毕,运用MARK N达到从堆栈方便地退出所有参数的目的