[转译][马基 杰斯特(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

具体细节请参照第五章第二节相关内容

不同点在于JSRJMP多做了一件事,那就是JSR把返回地址保存到了里,于是 m68k 可以再跳回JSR的位置,然后再继续

RTS 指令

JSR (ReTurn from Subroutine) - 子过程返回

这条指令会从里读取返回地址,然后把返回地址放到PC里,于是 m68k 就会从返回地址开始继续执行

例子

这是一个JSRRTS一同使用的例子:

    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之后的第一条指令处,继续执行
  • 然后move.w #$0020, d10020放到d1
  • 然后又遇到了一个jsr AddNumber,m68k 跳转到AddNumber子过程,并且把返回地址存到
  • 接着add.w d1,d2会把d1的内容加到d2
  • 然后rts会从里把返回地址读出来然后放到PC
    • m68k 会返回到jmp Continue处,也就是在第一个jsr AddNumber之后的第一条指令处,继续执行
  • jmp Continue跳过AddNumber:子过程而直接从Continue:处继续执行

下面是一个形象的执行过程:

然后第二个 JSR/RTS

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 4. SP (Stack Pointer) 栈指针寄存器
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 6. BSR (分支到子过程) 指令

posted @ 2020-03-10 10:18  草帽过客  阅读(1349)  评论(0编辑  收藏  举报