[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 6. BSR (分支到子过程) 指令
注意:本文经过原作者授权转译,转载请标明出处
原文地址:http://mrjester.hapisan.com/04_MC68/Sect05Part06/Index.html
条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正
译文:
"有的父母说是玩具枪让他们的孩子变得好斗。但是事实上如果你给他一个橡胶做的鸭子玩具,他也会像拿着手枪一样握着鸭子的脖子,然后对着你大叫一声:嘭!" ---- 乔治 威尔 (George Will)
简介
BSR (Branch to SubRoutine) - 分支到子过程
这条指令会把目的操作数的内容加到PC里,然后把返回地址放到栈里,然后 m68k 会从PC里的地址处继续执行
例子
这个例子跟JSR指令的例子很像,只有一点点的区别 (和BRA与JMP的区别差不多),比如:
    bsr.s      Subroutine
    jmp        Continue
  Subroutine:
    rts
  Continue:
    ...etc
很明显:
- bsr.s Subroutine会让 m68k 分支到- Subroutine:处然后保存返回地址到- 栈
- rts会从- 栈中读取返回地址然后让程序返回到- bsr.s Subroutine的下一条指令
这部分你在读了 第五章第五节 (JSR & RTS) 之后应当很清楚了已经
同样的,BSR和JSR最大的区别在于指令在内存的存储方式和处理器执行指令需要的时间。BSR指令比较类似于BRA,你可以指定两种指令所使用的长度:.s表示短整型而.w表示一个字
对于bsr.s来说,附加的偏移值只有一个字节大小,而且是个有符号数,也就是说向前可以分支的最大字节数是7E,向后分支的最大字节数是80,所以显然BSR没有JSR跳转的距离远
对于bsr.w来说,附加的偏移值只有一个字大小,而且是个有符号数,也就是说向前可以分支的最大字节数是7FFE,向后分支的最大字节数是8000
如你所见,bsr.w的分支范围比bsr.s要大,但仍然原小于JSR的跳转能力
用法
就像BRA和JMP一样,在BSR与JSR之间的选择上,你可能希望使用又快又小的那个,下面是一张他们跳转能力的表格:
| 指令 | 内存形式/长度 | 范围 | 
|---|---|---|
| bsr.s | 61 ?? | 向前或向后 7E字节 | 
| bsr.w | 61 00 ?? ?? | 向前或向后 7FFE字节 | 
| jsr | 4E B9 00 ?? ?? ?? | 000000 - FFFFFF (无限制) | 
当然,你的优先级是:
优先级是:
bsr.s -> bsr.w -> jsr
目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 5. JSR & RTS (子过程调用/返回) 指令
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 1. CCR (状态字寄存器)
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号