[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 3. BRA (分支) 指令

注意:本文经过原作者授权转译,转载请标明出处

原文地址:http://mrjester.hapisan.com/04_MC68/Sect05Part03/Index.html

条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正

译文:

"在我的身后,那荒芜破败的树枝在嘎吱作响" ---- 古斯塔夫 马勒 (Gustav Mahler, 1860-1911),奥地利作曲家及指挥家

简介

BRA (BRanch Always) - 无条件分支

这条指令会把目的操作数的内容加到PC上,然后再从PC中的位置继续执行程序

例子

这和JMP指令非常相似,除了一点点的区别。下面是和上一节差不多的例子,只是把里面的JMP指令换成了BRA指令:

    move.w     d0, d1
    add.w      d1, d1
    add.w      d1, d0
    bra.s      SkipCode
    add.w      d2, d3
    asr.w      #$04, d0

  SkipCode:
    move.w     d0, d2

中间那个就是从上到下崭崭新的BRA指令:

    bra.s      SkipCode

这一串指令所做的事情也和上一节很像:

他们之间主要的区别就是内存使用还有处理时间BRA指令会比JMP指令执行速度更快,而且占用更少的内存,可以节省你的内存空间以及提升执行效率

现在你们可能会问了,"既然BRA指令又小又快,那JMP指令的存在又有什么意义呢?"

问得好,先让我们来康康内存:

偏移量 0 1 2 3 4 5 6 7 8 9 A B C D E F
...
00244200 32 00 D2 41 D0 41 60 04 D6 42 E8 40 34 00 00 00
00244210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00244220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00244230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...

如你所见,既然BRA指令 (6004) 是JMP指令的 1/3 大小,60表示bra.s04是加到PC上的值

附加的这个值 (偏移量,见相对寻址) 只有一个字节大小,而且它是个有符号数,也就是说这条指令可以向前分支最多的字节是7E,而它向后分支最远是80,所以答案很明显了,bra.s不能像JMP指令那样跳到任何位置

刚刚说的都是bra.s,其中的.s表示的是short,即短整型,当然还有指令可以使用的另一种长度bra.w,其中的.w表示的是

    move.w     d0, d1
    add.w      d1, d1
    add.w      d1, d0
    bra.w      SkipCode
    add.w      d2, d3
    asr.w      #$04, d0

  SkipCode:
    move.w     d0, d2

偏移量 0 1 2 3 4 5 6 7 8 9 A B C D E F
...
00244200 32 00 D2 41 D0 41 60 00 00 06 D6 42 E8 40 34 00
00244210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00244220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00244230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...

在这种情况下,分支指令比之前要长了一倍 (60000006),不过仍然要比JMP指令更小更快。60表示bra,紧接其后的00表示.w,然后0006是加到PC上的值

疑问:似乎在跳转之前,读取指令之后,PC只是+2而不是加了这条bra指令的长度,然后再+6,emmmmm...

附加的这个值有一个大小,也是个有符号数,也就是说这条指令可以向前分支最多的字节是7FFE,而它向后分支最远是8000

疑问:为什么向前跳转最多是7FFE而不是7FFF????

如你所见,它的寻址范围比bra.s要更大一些,但仍然要比JMP指令小

用法

在有些时候你可能想要用最快最小的指令,下面是一张简明的表格表示了跳转和分支指令以及它们的跳转范围:

指令 内存形式/长度 范围
bra.s 60 ?? 向前或向后7E字节
bra.w 60 00 ?? ?? 向前或向后7FFE字节
jmp 4E F9 00 ?? ?? ?? 000000 - FFFFFF (无限制)

bra.s是这三个中最小最快的,不过它的跳转范围很受限,而JMP允许你跳到任何位置,然而它占用更多的内存空间而且会占用 m68k 更长的处理时间

一般来说,如果你想去优化你的代码,优先级是:

    bra.s -> bra.w -> jmp

先去尝试使用bra.s,如果跳转的位置太远了,就用bra.w,如果还要更远的话,就用jmp

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

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