您当前的位置:五五电子网电子知识单片机-工控设备ARM单片机ARM 指令格式和时序(3) 正文
ARM 指令格式和时序(3)

ARM 指令格式和时序(3)

点击数:7193 次   录入时间:03-04 12:04:03   整理:http://www.55dianzi.com   ARM单片机

块数据传送
xxxx100P USWLnnnn llllllll llllllll

典型的汇编语法:

LDMFD Rn!, {R0-R4, R8, R12}
STMEQIA Rn, {R0-R3}
STMIB Rn, {R0-R3}^

使用这些指令来同时装载/存储多个寄存器从/到内存。使用的内存地址从在基址寄存器 Rn 中持有的值指定的内存地址要么增加要么减少地址,(可以存储基址寄存器自身),并且最终的地址可以被写回到基址寄存器中。这些指令适合于实现栈,在进入/退出一个子例程时存储/恢复寄存器的内容。

U 位指示对每个寄存器地址将被 +4 (设置)所修改,还是被 -4 (清除)所修改。

W 位总是指示写回。

如果设置了 L 位,则指示进行一个装载操作,如果清除了,则指示存储。

使用 P 位指示在每次装载/存储之前还是之后增加/减少基址寄存器(参见下面表格)。

如果这个操作要装载/存储 Rl 则设置位 l。

汇编器典型的用条件代码跟随助记符根,并随后用两个字母代码指示 U 和 W 位的设置。

根 意思 P U

DA 在每次存储/装载之后减少 Rn 0 0
DB 在每次存储/装载之前减少 Rn 1 0
IA 在每次存储/装载之后增加 Rn 0 1
IB 在每次存储/装载之前增加 Rn 1 1

在实现栈的时候有更清楚的同义词:

根 意思

EA 空升序栈
ED 空降序栈
FA 满升序栈
FD 满降序栈

在一个空栈中,栈指针指向下一个空位置。在一个满栈中栈指针指向最顶端满位置。升序栈向高位置增长,而降序栈向低位置增长。

存储的寄存器总是最低编号的寄存器在内存中在最低地址。这可以影响入栈和出栈代码。例如,如果我想把 R1-R4 压入栈中,接着每次把它们中的两个装载回来,要使它们回到原先的寄存器,对于降序栈我需要做类似下面的事:

STMFD R13!,{R1,R2,R3,R4} ;放置 R1 在内存低端,就是说在栈顶
LDMFD R13!,{R1,R2}
LDMFD R13!,{R3,R4}


对于升序栈则是:
STMFA R13!,{R1,R2,R3,R4} ; 放置 R4 在内存高端,就是说在栈顶
LDMFA R13!,{R3,R4}
LDMFA R13!,{R1,R2}


同义的代码如下:

代码 装载 存储

EA DB IA
ED IB DA
FA DA IB
FD IA DB

S 为控制两个特殊的功能,它们被汇编器指示为在指令的结束处放置“^”:
如果设置了 S 位,并且指令是 LDM 而 R15 在寄存器列表中,则:
在 26-bit 特权模式下,装载 R15 的所有 32 位。
在 26-bit 用户模式下,装载 R15 的 4 个标志位和 24 个 PC 位。忽略装载值的位 27、26、1 和 0。
在 32-bit 模式下,装载 R15 的所有 32 位,但要注意底端的两位总是零,所以忽略装载到它们的任何东西。除此之外,把当前模式的 SPSR 传送到 CPSR;因为用户模式没有 SPSR,这种类型的指令不应该用在 32-bit 用户模式下。
如果设置了 S 位,并且要么指令是 STM 要么 R15 不在寄存器列表中,则传送用户模式的寄存器而不是当前模式的寄存器。在用户模式下不应该使用这个指令。
特殊情况发生在基址寄存器存在于要传送的寄存器列表中的时候。

基址寄存器总是可以被装载而没有任何问题。但是,如果基址寄存器被装载则不能指定写回 - 你不能同时把写回值和装载值二者写到基址寄存器中!
如果不使用写回则可以存储基址寄存器而没有任何问题。
如果在存储包含基址寄存器的一个寄存器列表的时候使用了写回,则只有在基址寄存器是列表的第一个的情况下,才在写回之前写基址寄存器的值到内存。其他情况,写到内存中的值未被定义。
进一步的特殊情况发生在程序计数器存在于要装载和保存的寄存器列表中。

(在 26 位模式下) PSR 总是与 PC 一起保存((在所有模式下) PC 总是超出当前执行的指令的地址 12 字节,而不是通常的 8 字节)。
在装载时,只有在设置了 S 位的时候,才影响 PSR 的在当前模式下可改变的位。
PC 不应该作为基址寄存器。

块装载使用 nS + 1N + 1I + (1S + 1N 如果改变了 PC )个周期,而块存储使用 (n-1)S + 2N 个周期,这里的“n”是被传送的字的数目。


软件中断
xxxx1111 yyyyyyyy yyyyyyyy yyyyyyyy

典型的汇编语法:

SWI "OS_WriteI"
SWINE &400C0

在遇到软件中断的时候,ARM 切换到 SVC 模式中,把 R15 的当前值保存到 R14_SVC 中,并跳转到内存中的位置 8,它假定在这里可以找到一个 SWI 处理例程来解码刚才执行的 SWI 指令的低 24 位,并以特定于操作系统的方式做与 SWI 编号有关的事情。

在 ARM 上写的操作系统典型的使用 SWI 来为编程者提供各种例程。

执行 SWI 指令使用 2S + 1N 个周期(加上解码 SWI 编号和执行适当例程使用的时间)。


协处理器数据操作
xxxx1110 oooonnnn ddddpppp qqq0mmmm

典型的汇编语法:

CDP p, o, CRd, CRn, CRm, q
CDP p, o, CRd, CRn, CRm

把这个指令传递给协处理器 p,告诉它在协处理器寄存器 CRn 和 CRm 上,进行操作 o,并把结果放置到 Crd 中。

可以使用 qqq 提供与操作有关的补充信息。

这些指令的准确意思依赖于使用的特定的协处理器;上面只是推荐的位的用法(实际上 FPA 就不遵守它)。 唯一强制的部分是 pppp 必须是协处理器编号: 协处理器设计者自由的按需要分配 oooo、nnnn、dddd、qqq 和 mmmm。

如果协处理器以与推荐的不同的方式使用这些位,可能需要使用汇编器宏来对人有意义的指令语法转换成正确的 CDP 指令。对最常使用的协处理器如 FPA,许多汇编器有额外的内置助记符并自动做这个转换。(例如,汇编 MUFEZ F0,F1,#10 成等价的 CDP 1,1,CR0,CR9,CR15,3。)

当前定义的协处理器编号包括:

1 和 2 浮点单元
15 Cache 控制器

如果做了到协处理器的一个调用而协处理器未做响应(通常因为它不存在!),则调用未定义指令向量(完全同于后面描述的未定义指令)。这用于在没有 FPA 的机器上透明的提供 FP 支持。

执行这些指令使用 1S + bI 个周期,这里的 b 是协处理器在接受指令之前导致 ARM 忙等的周期数目: 这在协处理器控制之下。


协处理器数据传送和寄存器传送
xxxx110P UNWLnnnn DDDDpppp oooooooo LDC/STC
xxxx1110 oooLNNNN ddddpppp qqq1MMMM MRC/MCR

它们还是依赖于使用的特定协处理器 p。

N 和 D 表示协处理器寄存器编号,n 和 d 是 ARM 处理器编号。o 是协处理器使用的操作。 M 表示协处理器自由的按需使用的位。

在第一种形式中,如果 L=1 则表示 LDC,否则是 STC。这些指令分别的表现得象 LDR 或 STR,在带有立即数偏移量的各种情况下,有下列例外。

偏移量是 4*(oooooooo),不是通常的 12-bit 常数。
如果指定了 P=0 (过后变址),则 W 必须是 1,而 W 是 1 只是指示要求写回,而不是告诉内存系统 这是一个用户模式传送。为将来的扩充保留 P=0 和 W=0 的指令。
在装载或存储一个或更多协处理器寄存器时,协处理器从 DDDD 和 N 位确定要装载或存储多少和哪个寄存器: ARM 所做的就是传送一个字到/从指示的地址,接着传送另一个到/从指示的地址 + 4,接着传送一个到/从指示的地址 + 8,以此类推,直到协处理器告诉它停止。
作为惯例,DDDD 表示要装载或存储的(第一个)协处理器寄存器,而 N 以某种方式表示长度,使用 N=1 指示一个“长”形式。协处理器设计者可以自由的忽略它...
下面是汇编语法:
LDC p,CRd,[Rn,#20] ;短形式 (N=0), 预先变址
STCL p,CRd,[Rn,#-32]! ;长形式 (N=1), 带写回的预先变址
LDCNEL p,CRd,[Rn],#-100 ;长形式 (N=1), 过后变址

在第二种形式中,如果 L=1 则表示 MRC, 否则是 MCR。MRC 传送一个协处理器寄存器到一个 ARM 寄存器, MCR 做反方向传送(字母看起来象是写反了,记住在 ARM 汇编器中目的通常写在左边)。

MCR 传送 ARM 寄存器 Rd 的内容到协处理器。协处理器基于 ooo、dddd、qqq 和 MMMM 字段的值自由的做它想做的任何事情,尽管有一个“标准的”解释: 把它写到协处理器寄存器 CRN,使用操作 ooo,用 CRM 和 qqq 提供可能的补充控制。汇编语法是:

MCR p,o,Rd,CRN,CRM,q

给 MCR 指令的 Rd 不应该是 R15。

MRC 从协处理器传送一个单一的字并把它放置到 ARM 寄存器 Rd 中。协处理器使用与 MCR 相同的字段自由的以任何方式生成这个字,有一个标准的解释:它来自 CRN,使用操作 ooo,用 CRM 和 qqq 提供可能的补充控制。汇编语法是:

MRC p,o,Rd,CRN,CRM,q

如果给 MRC 指令的 Rd 是 R15,使用传送的字的顶端 4 位来设置标志;丢弃余下的 28 位。(例如,这种机制用于浮点比较指令。)

执行 LDC 和 STC 使用 (n-1)S + 2N + bI 个周期, MRC 使用 1S+bI+1C 个周期,而 MCR 使用 1S + (b+1)I + 1C 个周期,这里的 b 是协处理器在接受指令之前导致 ARM 忙等的周期数目: 这在协处理器控制之下,而 n 是传送的字的数目(注意这在协处理器而不是 ARM 的控制下)


单一数据交换(ARM 3 和以后,包括 ARM 2aS) 
xxxx0001 0B00nnnn dddd0000 1001mmmm

典型的汇编语法:

SWP Rd, Rm, [Rn]

这些指令装载一个内存的一个字(用寄存器 Rn 给出地址)到一个寄存器 Rd 并存储寄存器 Rm 到相同的地址。Rm 和 Rd 可以是同一个寄存器,在这种情况下交换寄存器和内存位置的内容。装载和存储操作通过设置 LOCK 引角(PIN)为高电平来在操作期间锁定在一起,这指示内存管理器它们应当被没有中断的完成。

如果设置了 B 位,则传送一字节的内存,否则传送一个字。

Rd、Rn、和 Rm 都不能是 R15。

执行这个指令使用 1S + 2N + 1I 个周期。


状态寄存器传送(ARM 6 和以后) 
xxxx0001 0s10aaaa 11110000 0000mmmm MSR 寄存器形式
xxxx0011 0s10aaaa 1111rrrr bbbbbbbb MSR 立即数形式

[1] [2]  下一页


本文关键字:暂无联系方式ARM单片机单片机-工控设备 - ARM单片机

上一篇:ARM定义