单一数据交换(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 立即数形式
xxxx0001 0s001111 dddd0000 00000000 MRS
典型的汇编语法:
MSR SPSR_all, Rm ;aaaa = 1001
MSR CPSR_**, #&F0000000 ;aaaa = 1000
MSRNE CPSR_ctl, Rm ;aaaa = 0001
MRS Rd, CPSR
设置 s 位时意味着访问当前特权模式的 SPSR,而不是 CPSR。只能在特权模式下执行这个命令的时候设置此位。
使用 MSR 来传送一个寄存器或常数到一个状态寄存器。
aaaa 位接受下列值:
值 意思
0001 设置有关的 PSR 的控制位。
1000 设置有关的 PSR 的标志位。
1001 设置有关的 PSR 的控制位和标志位(就是说所有现存的位)。
其他的值为将来的扩充而保留。 在寄存器形式中,源寄存器是 Rm。在立即数形式中,来源是 #b, ROR #2r。
R15 不应该被指定为 MRS 指令的源寄存器。
使用 MRS 来传送处理器的状态到一个寄存器。
dddd 位存储目的寄存器的编号;Rd 一定不能是 R15。
N.B. 指令编码对应于对应与操作码(opcode)是 10xx 并清除了 S 位的数据处理指令(就是测试指令)。
执行这些指令总是使用 1S 个周期。
未定义指令xxxx0001 yyyyyyyy yyyyyyyy 1yy1yyyy 专属 ARM 2
xxxx011y yyyyyyyy yyyyyyyy yyy1yyyy
这些指令目前未定义。在遇到未定义指令时,ARM 切换到 SVC 模式(在 ARM 3 和以后)或 Undef 模式(在 ARM 6 和以后),把 R15 的旧有值放置到 R14_SVC (或 R14_UND)中并跳转到一个位置,在那里它希望找到解码这个未定义指令的代码并相应的执行它。
注意:
这些指令被文档为“未定义的”,原因是这种方式下它们进入未定义指令处理器陷阱。许多其他指令是以更宽松的方式未被定义的,而不说出它们做什么。 例如,下面形式的位模式(pattern): xxxx0000 01xxxxxx xxxxxxxx 1001xxxx
与数据处理的指令、乘法、长乘法和 SWP 指令有关,但却不是其中一个的原因是: 数据处理指令的位 25 = 0 和位 4 = 1 时有寄存器控制的移位,所以必须位 7 = 0。 乘法指令的位 23:22 = 00。 长乘法指令的位 23:22 = 1U。 SWP指令的位 24 = 1。 这些指令只是简单的未定义做什么,但是上面列出的那些指令实际上定义为进入未定义指令陷阱,至少直到将来为它们找到某种用途。 注意“专属 ARM2”的未定义指令包括了在 ARM3/ARM2as 和以后成为 SWP 的那些指令。 |