示例
mov r2, #0x1000
led_loop:
sub r2, r2, #0x1/*Thumb-2 ADD and SUB only,对R2寄存器减1*/cmp r2, #0x0
bne led_loop/*BNE指令 是“不相等(或不为0)跳转指令 ”:*/
ldr r0, =pGPBDAT/*R0保存要设置的寄存器*/
ldr r1, =0x1E0 /*R1保存要设置的值*/
str r1, [r0]/*赋值给寄存器*/
mov pc, lr/*返回*/
以下内容是RealView 编译工具 《汇编器指南》中的通用数据处理部分。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Cihcjfjg.html
4.3.2. ADD、SUB、RSB、ADC、SBC 和 RSC
加法、减法和反向减法,均可带进位或不带进位。
另请参阅并行加法和减法。
op{S}{cond} {Rd}, Rn, Operand2
op{cond} {Rd}, Rn, #imm12 ; Thumb-2 ADD and SUB only
其中:
ADD
指令将 Rn
中的值与 Operand2
中的值相加。
SUB
指令从 Rn
中的值中减去 Operand2
中的值。
RSB
(反向减法)指令可从 Operand2
中的值减去 Rn
中的值。 这是很有用的,因为有了该指令,Operand2
的选项范围就会更大。
您可利用 ADC
、SBC
和 RSC
来进行合成多字运算(请参阅多字算法示例)。
ADC
(带进位加法)指令将 Rn
中的值和 Operand2
中的值相加(带进位标记)。
SBC
(带进位减法)指令可从 Rn
中的值中减去 Operand2
中的值。 如果清除进位标记,则结果将减 1。
RSC
(带进位反向减法)指令可从 Operand2
中的值中减去 Rn
中的值。 如果清除进位标记,则结果将减 1。
在某些情况下,汇编器可能会进行替换指令。 阅读反汇编列表时请注意这一点。 有关详细信息,请参阅指令替换。
这些指令中的大多数都不能将 pc (r15) 用于 Rd
或任何操作数。
但也有例外,可以在 ADD
和 SUB
指令中,将 pc 用于 Rn
,这要求常数值 Operand2
要在 0-4095 范围内,且不能有 S
后缀。 这些指令可用于生成 pc 相对地址。 在上述情况下,pc 值的位 [1] 都会为 0,以使计算时基址始终为字对齐。
另请参阅SUBS pc, lr。
另请参阅ADR。
如果将 pc (r15) 用作 Rn
,则所用的值为指令地址加 8。
如果将 pc 用作 Rd
,则:
-
代码将跳转到与结果相对应的地址执行。
-
如果使用
S
后缀,则当前模式的 SPSR 会复制到 CPSR。 您可利用此机制从异常中返回(请参阅《开发指南》中的第 6 章 处理处理器异常)。
另请参阅ADR。
Caution
在用户模式和系统模式下,若是将 pc 用作
,则不要使用 Rd
S
后缀。 此类指令的结果不可预知,而且汇编器在汇编时不会发出警告。
在所有由寄存器控制移位的数据处理指令中,都不能将 pc 用于 Rd
或任何操作数(请参阅灵活的第二操作数)。
这些指令的下列形式可用于 Thumb-2 之前的 Thumb 代码中,在 Thumb-2 代码中使用时为 16 位指令:
-
范围为 0-7。imm
和Rd
必须都是 Lo 寄存器。Rn
-
、Rd
和Rn
必须都是 Lo 寄存器。Rm
-
ARMv6 及更低版本:
和/或Rd
必须是 Hi 寄存器。 ARMv6T2 及更高版本: 无此限制。Rm
-
范围为 0-255。imm
必须是 Lo 寄存器。Rd
-
、Rd
和Rn
必须都是 Lo 寄存器。Rm
-
范围为 0-508,字对齐。imm
-
范围为 0-1020,字对齐。imm
必须是 Lo 寄存器。Rd
-
范围为 0-1020,字对齐。imm
必须是 Lo 寄存器。 在此指令中,pc 的位 [1:0] 将为 0。Rd
-
、Rd
和Rn
必须都是 Lo 寄存器。Rm
-
范围为 0-7。imm
和Rd
必须都是 Lo 寄存器。Rn
-
范围为 0-255。imm
必须是 Lo 寄存器。Rd
-
、Rd
和Rn
必须都是 Lo 寄存器。Rm
-
范围为 0-508,字对齐。imm
-
和Rd
必须都是 Lo 寄存器。Rn
ADDS Rd
, Rn
, #imm
ADDS Rd
, Rn
, Rm
ADD Rd
, Rd
, Rm
ADDS Rd
, Rd
, #imm
ADCS Rd
, Rd
, Rm
ADD SP, SP, #imm
ADD Rd
, SP, #imm
ADD Rd
, pc, #imm
SUBS Rd
, Rn
, Rm
SUBS Rd
, Rn
, #imm
SUBS Rd
, Rd
, #imm
SBCS Rd
, Rd
, Rm
SUB SP, SP, #imm
RSBS Rd
, Rn
, #0
ADD r2, r1, r3 SUBS r8, r6, #240 ; sets the flags on the result RSB r4, r4, #1280 ; subtracts contents of r4 from 1280 ADCHI r11, r0, r3 ; only executed if C flag set and Z ; flag clear RSCSLE r0,r5,r0,LSL r4 ; conditional, flags set
下面两个指令将 r2
和 r3
中包含的 64 位整数与 r0
和 r1
中的包含的 64 位整数相加,并将结果存入 r4
和 r5
中。
ADDS r4, r0, r2 ; adding the least significant words ADC r5, r1, r3 ; adding the most significant words
下面的指令可完成 96 位整数的减法:
SUBS r3, r6, r9 SBCS r4, r7, r10 SBC r5, r8, r11
为了便于理解,对于多字值,上面的示例使用的是连续的寄存器。 实际上并没有这种要求。 例如,下面的示例也完全有效:
SUBS r6, r6, r9 SBCS r9, r2, r1 SBC r2, r8, r11