[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 7. 无符号比较分支 (BCC, BHI, BLS, BCS)

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

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

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

译文:


"如果你想要提携我,那你得站的比我高才行" ---- 拉尔夫 瓦尔多 爱默生 (Ralph Waldo Emerson, 1803-1882),美国思想家、文学家,诗人

简介

这些分支指令会在某个数值大于或是小于一个特定的值的时候去分支跳转。它们只和无符号数打交道,也就是说如果使用的是字节长度的话,00是最小值,而FF是最大值

所以如果我们比较FE02的话,FE会被认为比02要大

BCC 指令

BCC (Branch on Carry Clear) - 大于等于 (≥) 时分支

如果C的内容是0的话,目的操作数会被加到PC里,然后 m68k 会在PC里的新的地址处继续执行,否则,这条指令会被忽略

例子

这条指令通过C状态标志是否是0来检测计算结果是不是大于等于 (≥),有趣的是当C的内容是0的时候,计算结果总是"大于等于":

    cmpi.w     #$0020, d0
    bcc.s      Is20orHigher
    move.w     #$0000, d0

  Is20orHigher:

我们假定d0的内容是00009800CMP指令使用的长度是,所以会在00209800之间比较

  • 9800大于0020,所以 m68k 会跳转到Is20orHigher处继续执行

如果我们假设d0的内容是0000001FCMP指令使用的长度是,所以会在0020001F之间比较

  • 001F并不大于等于0020,所以指令会被忽略

你也可以使用助记符BHS (Branch on Higher than or Same, 大于或相同时分支) 来代替BCC,它们的效果是一样的,BHSBCC更容易根据它的具体意思来让人记住,汇编程序会自动的把BHS转换成BCC

BHI 指令

BHI (Branch on HIghter than) - 大于 (>) 时分支

如果CZ的内容都是0的话,目的操作数会被加到PC里,然后 m68k 会在PC里的新的地址处继续执行,否则,这条指令会被忽略

例子

这条指令通过CZ两个状态标志一起来检测计算结果是不是大于 (>):

    cmpi.w     #$0020, d0
    bhi.s      IsHigher
    move.w     #$0000, d0

  IsHigher:

我们假定d0的内容是00000020CMP指令使用的长度是,所以会在00200020之间比较

  • 0020等于0020,所以指令会被忽略

如果我们假设d0的内容是0000F492CMP指令使用的长度是,所以会在0020F492之间比较

  • F492大于0020,所以 m68k 会跳转到IsHigher处继续执行

BLS 指令

BLS (Branch on Less than or Same) - 小于等于 (≤) 时分支

如果CZ的内容都是1的话,目的操作数会被加到PC里,然后 m68k 会在PC里的新的地址处继续执行,否则,这条指令会被忽略

例子

这条指令和BCC (BHS) 恰恰相反:

    cmpi.w     #$0020, d0
    bls.s      Is20orLower
    move.w     #$0000, d0

  Is20orLower:

我们假定d0的内容是00009800CMP指令使用的长度是,所以会在00209800之间比较

  • 9800并不小于等于0020,所以指令会被忽略

如果我们假设d0的内容是00000001CMP指令使用的长度是,所以会在00200001之间比较

  • 0001小于0020,所以 m68k 会跳转到Is20orLower处继续执行

BCS 指令

BCS (Branch on Carry Set) - 小于 (<) 时分支

如果C状态标志是1的话,目的操作数会被加到PC里,然后 m68k 会在PC里的新的地址处继续执行,否则,这条指令会被忽略

例子

这条指令和BHI恰恰相反:

    cmpi.w     #$0020, d0
    bcs.s      IsLower
    move.w     #$0000, d0

  IsLower:

我们假定d0的内容是00000020CMP指令使用的长度是,所以会在00200020之间比较

  • 0020等于0020,所以指令会被忽略

如果我们假设d0的内容是00000004CMP指令使用的长度是,所以会在00200004之间比较

  • 0004小于0020,所以 m68k 会跳转到IsLower处继续执行

你也可以使用助记符BLO (Branch on LOwer, 大于或相同时分支) 来代替BCS,它们的效果是一样的,BLOBCS更容易根据它的具体意思来让人记住,汇编程序会自动的把BLO转换成BCS

BHS 和 BLO

BHSBLO是分别对应于BCCBCS的一对助记符,值得注意的是,BHSBCC是同一个指令,BLOBCS也是同一个指令,只是名字不同而已

家庭作业

又到了这个有趣的时刻,你大概已经清楚了分支,条件分支还有跳转的这些指令,现在有一串指令它们使用了最近两章学习的指令,让我们来康康吧:

    move.w     #$0010, d0
    clr.l      d1
    move.w     #$0400, d4
    clr.l      d2
    move.w     #$1000, d3

  NotReached:
    addi.b     #$10, d2
    add.w      d0, d1
    cmp.w      d1, d4
    bgt.s      NotReached
    sub.w      d2, d1
    subi.w     #$1000, d3
    bpl.s      NotReached
    move.w     d1, d0
    swap       d0
    move.w     d3, d0

那么这些指令执行完之后d0的内容会是多少呢 (这个有点复杂,也就是说你要追踪每一个寄存器又或是跳转很多次,不过就像他们常说的那样,你要先学会残忍才能懂得仁慈)

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 6. 有符号比较分支 (BGE, BGT, BLE, BLT)
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 陆 - 条件分支 | 8. 家庭作业答案 - 5

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