电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • APP

    随时找料

    即刻洽谈

    点击下载PC版
  • 公众号

    电子元器件

    采购信息平台

  • 移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

ARM 指令格式和时序(2)

来源:-- 作者:-- 浏览:645

标签:

摘要:如果使用寄存器形式,则 Op2 被设置为依据下面描述的 t 来移位的 Rm 的内容。如果使用立即数形式,则 Op2 = #b, ROR #2r。 t 汇编器 解释000 LSL #c 逻辑左移001 LSL Rc 逻辑左移010 LSR #c for c != 0 逻辑右移LSR #32 for c = 0011 LSR Rc 逻辑右移100 ASR #c for c !=

如果使用寄存器形式,则 Op2 被设置为依据下面描述的 t 来移位的 Rm 的内容。如果使用立即数形式,则 Op2 = #b, ROR #2r。

t 汇编器 解释

000 LSL #c 逻辑左移
001 LSL Rc 逻辑左移
010 LSR #c for c != 0 逻辑右移
LSR #32 for c = 0
011 LSR Rc 逻辑右移
100 ASR #c for c != 0 算术右移
ASR #32 for c = 0
101 ASR Rc 算术右移
110 ROR #c for c != 0 循环右移
RRX for c = 0 带扩展的循环右移一位
111 ROR Rc 循环右移

在寄存器形式中,用位 8-11 表示 Rc;如果使用 Rc 则位 7 必须清除。(如果你编码为 1,你将得到一个乘法、SWP 或未分配的指令而不是一个数据处理指令。)

还有,只使用了 Rc 的底端字节 - 如果 Rc = 256, 则移位将是零。

“MOV[S] Ra,Rb,RLX” 可以通过 ADC[S] Ra,Rb,Rb 来完成,这里的 RLX 意思是带扩展的循环左移一位。

多数汇编器允许使用 ASL 作为 LSL 的同义词。因为对算术左移是什么有不同的意见,最好使用术语 LSL。

通过在 MOV、MVN 或逻辑指令中设置 S 位,(在寄存器或立即数形式中)把进位标志设置为最后移出的那一位。

如果不做移位,则不影响进位标志。

如果立即数有可选择的多个形式(例如,#1 可以表示为 1 ROR #0、4 ROR #2、16 ROR #4 或 64 ROR #6),则汇编器希望使用涉及零移位的那个形式,如果可获得的话。所以,如果 0 <= const <= 255,则 MOVS Rn,#const 将保持进位标志不受影响,否则将改变它。


aaaa 汇编器 意思 P-Code

0000 AND 逻辑与 Rd = Rn AND Op2
0001 EOR 逻辑异或 Rd = Rn EOR Op2
0010 SUB 减法 Rd = Rn - Op2
0011 RSB 反向减法 Rd = Op2 - Rn
0100 ADD 加法 Rd = Rn + Op2
0101 ADC 带进位的加法 Rd = Rn + Op2 + C
0110 SBC 带借位的减法 Rd = Rn - Op2 - (1-C)
0111 RSC 带借位的反向减法 Rd = Op2 - Rn - (1-C)
1000 TST 测试位 Rn AND Op2
1001 TEQ 测试等同 Rn EOR Op2
1010 CMP 比较 Rn - Op2
1011 CMN 比较取负 Rn + Op2
1100 ORR 逻辑或 Rd = Rn OR Op2
1101 MOV 传送值 Rd = Op2
1110 BIC 位清除 Rd = Rn AND NOT Op2
1111 MVN 传送取非 Rd = NOT Op2

注意 MVN 和 CMN 不是象表面上的那种关系;MVN 使用直接的逐位(bitwise)非操作,把 Rn 设置为 Op2 对 1 的补码(反码)。CMN 把 Rn 与 Op2 对 2 的补码进行比较。
这些指令可归入 4 个子集:

MOV, MVN
Rn 被忽略,并且应当是 0000。如果设置了 S 位,则在结果上设置 N 和 Z 标志。并且如果使用了移位器,则 C 标志被设置为被移出的最后一位。不影响 V 标志。

CMN, CMP, TEQ, TST
Rd 不被指令所设置,并且应当是 0000。必须设置 S 位(多数汇编器会自动完成;如果没有设置它,则这个指令将是 MRS、MSR、或一个未分配的指令。)
算术操作(CMN, CMP)在结果上设置 N 和 Z 标志,从 ALU 得到 C 和 V 标志。

逻辑操作(TEQ, TST)在结果上设置 N 和 Z 标志,如果使用了移位器则从它得到 C 标志(在这种情况下它变成被移出的最后一位),不影响 V 标志。

有一个特殊情况(对于 ARMs >= 6,只针对 26 位模式),dddd 字段是 1111 导致用结果的相应的位设置标志(在用户模式下),或整个 26 位 PSR (在特权模式下)。这由给指令的 P 后缀来指示 - CMNP、 CMPP、TEQP、TSTP。常用 TEQP PC,#(新模式编号) 来改变模式。在 32 位模式,应当使用 MSR 来替代(因为 TEQP 等不再工作)。

ADC, ADD, RSB, RSC, SBC, SUB
如果设置了 S 位,则在结果上设置 N 和 Z 标志,从 ALU 的得到 C 和 V 标志。

AND, BIC, EOR, ORR
如果设置了 S 位,则在结果上设置 N 和 Z 标志,如果使用了移位器则从它得到 C 标志(在这种情况下它变成被移出的最后一位),不影响 V 标志。
可以使用 ADD 和 SUB 以与位置无关的方式使寄存器指向数据,例如 ADD R0,PC,#24。这很有用,一些汇编器有一个叫做 ADR 的特殊宏指令(directive),它自动生成恰当的 ADD 或 SUB 指令。(ADR R0, fred 典型的把 fred 的地址放置到 R0 中,假定 fred 在范围内)。

在 26-bit 模式下,在 R15 是使用的寄存器之一的时候发生一种特殊情况:

如果 Rn = R15 则使用的 R15 值屏蔽掉了所有 PSR 位。
如果 Op2 涉及 R15,则使用所有的 32 位。
在 32-bit 模式下,使用 R15 的所有的位。

在 26-bit 模式下,如果 Rd = R15 则:

如果未设置 S 位,则只设置 PC 的 24 位。
如果设置了 S 位,则覆写 PC 和 PSR 二者(除非在非用户模式下,否则不改变模式位、I 和 F 位。)
对于 32-bit 模式, 如果 Rd=15,则覆写 PC 的所有的位,不包括最低的那两个有效位,它们总是零。如果未设置 S 位,则只进行上面这些;如果设置了 S 位,把当前模式的 SPSR 复制到 CPSR 中。在 32-bit 用户模式下,你不应该执行把 PC 作为目的寄存器并设置了 S 位的指令,因为用户模式没有 SPSR。(顺便说一句,你这样做不会打断处理器 - 这样做的结果只是未定义而已,且在不同的处理器上可能不同。)

执行这些指令使用下列数目的周期: 1S + (1S 如果使用了寄存器控制的移位) + (1S + 1N 如果改变了 PC)


分支指令
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 标志。

它们的时序可以在上面的乘法段落中找到。

单一数据传送
xxxx010P UBWLnnnn ddddoooo oooooooo Immediate form
xxxx011P UBWLnnnn ddddCCcc ctt0mmmm Register form

典型的汇编语法:

LDR Rd, [Rn, Rm, ASL#1]!
STR Rd, [Rn],#2
LDRT Rd, [Rn]
LDRB Rd, [Rn]

这些指令装载/存储内存的一个字从/到一个寄存器。在指定地址时使用的第一个寄存器在术语上叫做基址寄存器。

如果设置了 L 位,则进行装载,否则进行存储。

如果设置了 P 位,则使用预先变址寻址,否则使用过后变址寻址。

如果设置了 U 位,则给出的偏移量被加到基址寄存器上 - 否则从中减去偏移量。

如果设置了 B 位,传送内存的一个字节,否则传送一个字。这在汇编器中表示为给根助记符的加上后缀‘B’。

W 位的解释依赖于使用的地址模式:

对于预先变址寻址,设置 W 位强制把用做地址转换的最终地址写回基址寄存器中。(例如,传送的副作用是 Rn := Rn +/- offset。这在汇编器中表示为给指令加上后缀 ‘!’。)
对于过后变址寻址,地址总是写回,设置 W 位指示在进行传送之前强制地址转换。这在汇编器中表示为给指令加上后缀‘T’。
地址转换导致芯片告知内存系统这是一个用户模式传送,而不管此时芯片是处于用户模式中还是处于特权模式中。这是有用的,例如在写模拟器的时候: 假如一个用户模式程序一个内存区域执行了一个 STF 指令,而用户模式代码不可以写这个内存区域。如果由一个 FPA 来指令它,它将异常终止。如果由一个 FPE 来执行它,它也应该异常终止。但是 FPE 运行在一个特权模式下,所以如果它使用普通存储指令,则它不会异常终止。为了使异常终止正确工作,在一个特权模式调用它时使用 STRT 替代普通存储指令,使其如同调用自用户模式。

如果使用这个指令的立即数形式,o 字段给出一个 12-bit 偏移量。如果使用了寄存器形式,则按对数据处理指令那样解码它,限制是不允许使用寄存器指令移位量。

如果 R15 被用做 Rd,不修改 PSR。PC 不应该被用在 Op2 中。

其他限制:

在基址寄存器是 PC 的时候不要使用写回或过后变址。
不要使用 PC 作为给 LDRB 或 STRB 的 Rd。
在使用带有寄存器偏移量的过后变址时,不要让 Rn 和 Rm 是同一个寄存器(这样做导致不可能从异常终止中恢复)。
装载使用 1S + 1N + 1I + (1S + 1N 如果改变了 PC)个周期,而存储使用 2N 个周期。

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67
Baidu
map