7.数据处理与传送指令
1)ADD 加法指令
指令格式:
ADD(S)<c> <Rd>, <Rn>, #<const> :立即数加法
示例:add r0, r1, #3 (r0 = r1 + 3)
ADD(S)<c> <Rd>, <Rn>, <Rm> :寄存器加法
示例:add r0, r1, r2 (r0 = r1 + r2)
ADD(S)<c> <Rd>, <Rn>, <Rm>, <type> <Rs> :带移位的寄存器加法
示例:add r0, r1, r2, lsl r3 (r0 = r1 + (r2 << r3))
立即数存储原理:
立即数有8位、10位、11位、12位等限制。
ARM中32位立即数由8位数值 + 4位循环右移位数组成(移位数为偶数,值为 2 * n,如24位对应右移12次)。
示例:0x234, 0x3f4, 0x132, 0xfab4。

以 0xFA00 为例,其二进制表示为 1 1 0 0 | 1 1 1 1 0 1 0,其中前4位 1100 是旋转位(十进制12,乘以2等于24位),后8位是 0xFA。通过循环右移24位(即左移8位)还原。

2)内存访问指令 (LDR/STR)
LDR指令:
功能1:将非立即数加载到通用寄存器。
功能2:将RAM中的数据加载到通用寄存器。
STR指令:
将通用寄存器中的值写入到RAM中。
内存地址分配示例:
int i = 2; int j = 5; int sum = i + j;
i 存放于 0x40000000
j 存放于 0x40000004
sum 存放于 0x40000008

3)位操作指令 (BIC/ORR)
bic指令:将某个通用寄存器清0(操作数中为bit1的位清0),清0结果写回到通用寄存器。
orr指令:将某个通用寄存器置1(操作数中为bit1的位置1),置1结果写回到通用寄存器。
8.跳转与分支指令
b指令:实现无条件跳转指令。
应用场景:条件分支(if-else)、循环(for/while)、函数调用。
bl指令:函数跳转前,会将函数返回地址保存到 lr (R14) 寄存器。
bx指令:bx lr 等价于 mov pc, lr,bx指令加一个地址。
C语言逻辑与汇编转换:
示例1:if (a > b)
{
max = a;
}
else
{
max = b;
}
示例2:for (i = 1; i <= 100; i++)
{
sum += i;
}
9.栈操作与混合编程
1)栈的分类
按增长方向:
增栈:入栈时,sp指针往上走。
减栈:入栈时,sp指针往下走。
按操作顺序:
空栈:先写数据,再挪指针。
满栈:先挪指针,再写数据。
ARM默认使用满减栈 (-sp)。
内存栈区示例(高地址到低地址):
起始地址:0x40001000
sp_svc 1K栈 (1024字节)
sp_user 2048字节
结束地址:0x40000000 (sp_irq在此附近)

2)批量入栈与出栈指令
stmfd:入栈保护
STMFD<c> <Rn>{!}, <registers>
stmfd sp!, <r0,r1,lr>
ldmfd:出栈恢复
LDMFD<c> <Rn>{!}, <registers>
ldmfd sp!, <r0, r1, lr>
3)汇编与C语言混合编程
(1)汇编调用C函数(如何向C语言传参):
当参数 <= 4个 时,通过通用寄存器 R0 - R3 进行传参。
当参数 > 4个 时,必须通过 栈 进行传参(入栈保护,出栈恢复)。
C语言将函数运行结果返回给 R0 寄存器。
(2)C调用汇编函数:
C语言向汇编函数传参,参数会被保存到通用寄存器。
汇编函数的结果通过 R0 寄存器返回给C语言。
10.程序状态寄存器操作指令
1)指令格式
mrs指令:读取某个特殊寄存器(cpsr)的值到通用寄存器。
格式:MRS<c> <Rd>, <spec_reg>
示例:mrs r0, cpsr
msr指令:将通用寄存器中的值写入到特殊寄存器(cpsr)。
格式:MSR<c> <spec_reg>, <Rn>
示例:msr cpsr, r0
2)切换处理器工作模式为USER模式
(1)将 cpsr 寄存器中的值读到 R0 寄存器。
(2)将 R0 寄存器中的值修改为 10000(USER模式的模式位)。
(3)将 R0 寄存器中的值写回到 cpsr 寄存器。
11.内存映射
nor flash:2MB,地址范围 0x00000000 - 0x1FFFFF。
RAM:4KB,地址范围 0x40000000 - 0x40000FFF。
PC指针:指向 0x00000000(nor flash起始地址),表明程序从nor flash启动。