[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 5. JSR & RTS (子过程调用/返回) 指令
注意:本文经过原作者授权转译,转载请标明出处
原文地址:http://mrjester.hapisan.com/04_MC68/Sect05Part05/Index.html
条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正
译文:
"我拒绝去蹦极,我因为一个坏掉的橡胶(套)来到这个世界,可不想再因为一个坏掉的橡胶(绳)离开" ---- 未知作者
JSR 指令
JSR (Jump to SubRoutine) - 跳转到子过程
这条指令执行时,目的操作数
会被移动到PC
里,而返回地址会被放到栈
中,m68k 会在目的操作数
中指定的地址继续程序
例子
这条指令和JMP
的效果几乎是一样的,当指令被读取的时候,地址被存放到PC
里,然后就会跳转到子过程执行:
move.w d0, d1
add.w d1, d1
add.w d1, d0
jsr SkipCode
add.w d2, d3
asr.w #$04, d0
SkipCode:
move.w d0, d2
具体细节请参照第五章第二节相关内容
不同点在于JSR
比JMP
多做了一件事,那就是JSR
把返回地址保存到了栈
里,于是 m68k 可以再跳回JSR
的位置,然后再继续
RTS 指令
JSR (ReTurn from Subroutine) - 子过程返回
这条指令会从栈
里读取返回地址,然后把返回地址放到PC
里,于是 m68k 就会从返回地址开始继续执行
例子
这是一个JSR
和RTS
一同使用的例子:
move.w d0, d1
jsr AddNumber
move.w #$0020, d1
jsr AddNumber
jmp Continue
AddNumber:
add.w d1, d2
rts
Continue:
...etc
- 首先
move.w d0,d1
会把d0
的内容复制到d1
里 - 然后
jsr AddNumber
会让 m68k 跳转到AddNumber
子过程,并且把返回地址存到栈
里 - 接着
add.w d1,d2
会把d1
的内容加到d2
上 - 然后
rts
会从栈
里把返回地址读出来然后放到PC
里- m68k 会返回到
move.w #$0020, d1
处,也就是在第一个jsr AddNumber
之后的第一条指令处,继续执行
- m68k 会返回到
- 然后
move.w #$0020, d1
把0020
放到d1
里 - 然后又遇到了一个
jsr AddNumber
,m68k 跳转到AddNumber
子过程,并且把返回地址存到栈
里 - 接着
add.w d1,d2
会把d1
的内容加到d2
上 - 然后
rts
会从栈
里把返回地址读出来然后放到PC
里- m68k 会返回到
jmp Continue
处,也就是在第一个jsr AddNumber
之后的第一条指令处,继续执行
- m68k 会返回到
jmp Continue
跳过AddNumber:
子过程而直接从Continue:
处继续执行
下面是一个形象的执行过程:
然后第二个 JSR/RTS
:
目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 4. SP (Stack Pointer) 栈指针寄存器
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 6. BSR (分支到子过程) 指令