快速掌握单片机基础(6)(数据处理与传送指令)(跳转与分支指令)(栈操作与混合编程)(程序状态寄存器操作指令)(内存映射)

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启动。

相关推荐
blue_ice .1 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
远翔调光芯片^138287988721 小时前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
时空自由民.2 小时前
WSL解决USB 串口连接问题与linux串口权限问题
linux·单片机
伟大的前程5 小时前
Flash 只能将比特从 1 改写为 0,无法从 0 改回 1
单片机
晊晌_h6 小时前
ARM 学习 |ARM 汇编指令实战笔记
嵌入式·arm·arm汇编
斑马1397 小时前
ARM学习笔记(一)——基本概念
arm开发·arm
DaTou大头7 小时前
STM32第六篇
单片机·嵌入式·电路基础
神威难绷泪9 小时前
arm day3 汇编LED / C语言LED
arm
Brilliantwxx9 小时前
【STM32】 SPI阻塞式通信与HAL源码(串口读ID实战)
开发语言·stm32·单片机·嵌入式硬件·ecmascript