打印

ARM 指令格式和时序4

[复制链接]
197|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菊江先生|  楼主 | 2018-8-31 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分支指令
分支指令
xxxx101L oooooooo oooooooo oooooooo
典型的汇编语法:
        BEQ  地址
        BLNE 子例程
使用这些指令强制跳转到一个新地址,用相对于执行这个指令时 PC 值的以字为单位的偏移量给出这个新地址。
因为流水线的缘故,PC 总是超出存储这个指令的地址 2 个指令(8 字节),所以分支的偏移量 = (位 0-23 的有符号扩展):
        目的地址 = 当前地址 + 8 + (4 * 偏移量)
在 26-bit 模式下,清除目的地址的顶端 6 位。 如果设置了 L 位,则在进行这个分支之前把 PC 的当前内容复制到 R14。所以 R14 持有在这个分支后面的指令的地址,被调用的例程可以用 MOV PC,R14 返回。
在 26-bit 模式下,使用 MOVS PC,R14 来从一个带连接的分支返回,在返回时可以自动恢复 PSR 标志。 在 32-bit 模式下 MOVS PC,R14 的行为是不同的,并只适合于从例外返回。
执行分支和带连接的分支二者都使用 2S+1N 个周期。
 
乘法xxxx0000 00ASdddd nnnnssss 1001mmmm
典型汇编语法:
        MULEQS Rd, Rm, Rs
        MLA    Rd, Rm, Rs, Rn
这些指令做两个操作数的乘法,并且可以选择加上第三个操作数,把结果放置到另一个寄存器中。
如果设置了 S 位,则在结果是设置 N 和 Z 标志,未定义 C 标志,不影响 V 标志。
如果设置了 A 位,则操作的效果是 Rd = Rm*Rs + Rn,否则是 Rd = Rm*Rs。
目的寄存器不应该与操作数寄存器 Rm 相同。R15 不应该用于操作数或目的寄存器。
执行这些指令在最坏的情况下使用 1S + 16I 个周期,并依赖于实际参数的值可以更小。实际时间依赖于 Rs 的值,依照下表:
         Rs 的范围                 周期数

           &0 -        &1              1S + 1I
           &2 -        &7              1S + 2I
           &8 -        &1F             1S + 3I
          &20 -        &7F             1S + 4I
          &80 -        &1FF            1S + 5I
         &200 -        &7FF            1S + 6I
         &800 -        &1FFF           1S + 7I
        &2000 -        &7FFF           1S + 8I
        &8000 -        &1FFFF          1S + 9I
       &20000 -        &7FFFF          1S + 10I
       &80000 -        &1FFFFF         1S + 11I
      &200000 -        &7FFFFF         1S + 12I
      &800000 -        &1FFFFFF        1S + 13I
     &2000000 -        &7FFFFFF        1S + 14I
     &8000000 -        &1FFFFFFF        1S + 15I
    &20000000 -        &FFFFFFFF        1S + 16I
这些乘法时序不适用于 ARM7DM。 ARM7DM 时序由下表给出:
                                        MLA/
            Rs 的范围            MUL        SMULL        SMLAL        UMULL        UMLAL

           &0 -        &FF             1S+1I        1S+2I        1S+3I        1S+2I        1S+3I
         &100 -        &FFFF            1S+2I        1S+3I        1S+4I        1S+3I        1S+4I
       &10000 -        &FFFFFF          1S+3I        1S+4I        1S+5I        1S+4I        1S+5I
     &1000000 -        &FEFFFFFF        1S+4I        1S+5I        1S+6I        1S+5I        1S+6I
    &FF000000 -        &FFFEFFFF        1S+3I        1S+4I        1S+5I        1S+5I        1S+6I
    &FFFF0000 -        &FFFFFEFF        1S+2I        1S+3I        1S+4I        1S+5I        1S+6I
    &FFFFFF00 -        &FFFFFFFF        1S+1I        1S+2I        1S+3I        1S+5I        1S+6I
长乘法(ARM7DM) xxxx0000 1UAShhhh llllssss 1001mmmm
典型的汇编语法:
        UMULL  Rl,Rh,Rm,Rs
        UMLAL  Rl,Rh,Rm,Rs
        SMULL  Rl,Rh,Rm,Rs
        SMLAL  Rl,Rh,Rm,Rs
这些指令做寄存器 Rm 和 Rs 的值的乘法并获得一个 64-bit 乘积。
在清除了 U 位的时候乘法是无符号的(UMULL 或 UMLAL),否则是有符号的(SMULL, SMLAL)。在清除了 A 位的时候,把结果的低有效的那一半存储在 Rl 中并把它的高有效的那一半存储到 Rh 中。在设置了 A 位的时候,转而把结果加到 Rh,Rl 的内容上。
不应该使用程序计数器 R15。Rh、Rl 和 Rm 应该不同。
如果设置了 S 位,则在 64-bit 位结果是设置 N 和 Z 标志,未定义 C 和 V 标志。
它们的时序可以在上面的乘法段落中找到。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

447

帖子

0

粉丝