基于ARM深入分析C程序

0 基于韦东山b站视频教程

视频链接:

C语言的本质(基于ARM深入分析C程序)_哔哩哔哩_bilibili

【直播公开课】韦东山老师嵌入式C语言加强,全天8小时直播,吐血整理可以分集观看!_哔哩哔哩_bilibili

1 ARM通用寄存器及其用途

  • R0-R12:这些是通用寄存器,用于存储临时数据和执行算术逻辑操作。在函数调用时,R0-R3通常用作参数寄存器,而R4-R12用于局部变量和临时存储。

  • R13/SP:栈指针寄存器(Stack Pointer Register),用于指向当前栈顶的地址。栈是用于存储程序执行过程中的临时数据,如函数参数、局部变量和返回地址。

  • R14/LR:链接寄存器(Link Register),用于存储子程序调用后的返回地址。当一个函数被调用时,处理器可以将下一条指令的地址存入LR,以便在函数执行完毕后返回到调用点。

  • R15/PC:程序计数器(Program Counter),指向下一条将要执行的指令的地址。PC寄存器是控制流管理的关键部分,决定了程序的执行顺序。

2 ARM基础汇编指令

2.1 数据传输指令

MOV:将一个立即数或寄存器的值复制到另一个寄存器。

复制代码
MOV R1, #10  ; 将立即数10赋值到寄存器R1
MOV R2, R1   ; 将寄存器R1的值复制到寄存器R2

LDR:从内存中加载数据到寄存器。

复制代码
LDR R1, [R2]  ; 将寄存器R2指向的内存地址中的值加载到寄存器R1
LDR R0, [R1, #4]     ; 将R1寄存器值加上4作为地址,从内存中读取一个字(32位)到R0寄存器

STR:将寄存器中的数据存储到内存中。

复制代码
STR R1, [R2]  ; 将寄存器R1的值存储到寄存器R2指向的内存地址
STR R2, [R3, #8]     ; 将R2寄存器的值写入到R3寄存器值加8所指向的内存地址

2.2 算术指令

ADD:将两个寄存器或一个寄存器和一个立即数的值相加,结果存储在目标寄存器中。

复制代码
ADD R3, R1, R2  ; 将寄存器R1和R2的值相加,结果存储在寄存器R3
ADD R7, R8, #100     ; R7 <- R8 + 100

SUB:从第一个寄存器中减去第二个寄存器的值。

复制代码
SUB R3, R1, R2  ; 将寄存器R1的值减去R2,结果存储在寄存器R3

MUL:两个寄存器值相乘。

复制代码
MUL R3, R1, R2  ; 将寄存器R1和R2的值相乘,结果存储在寄存器R3

DIV:第一个寄存器除以第二个寄存器的值。

复制代码
MOV R4, #2
MOV R5, #4
SDIV R6, R4, R5  ; 将寄存器R4的值除以R5,结果存储在寄存器R6

2.3 逻辑指令

AND:对两个寄存器进行按位与操作。

复制代码
AND R3, R1, R2  ; 将寄存器R1和R2的值进行按位与操作,结果存储在寄存器R3

ORR:对两个寄存器进行按位或操作。

复制代码
ORR R3, R1, R2  ; 将寄存器R1和R2的值进行按位或操作,结果存储在寄存器R3

EOR:对两个寄存器进行按位异或操作。

复制代码
EOR R3, R1, R2  ; 将寄存器R1和R2的值进行按位异或操作,结果存储在寄存器R3

BIC:清除寄存器中指定的位。

复制代码
BIC R3, R1, #0xFF  ; 清除寄存器R1的最低8位,结果存储在寄存器R3

2.4 数据移位指令

LSL (Logical Shift Left): 将一个寄存器中的值逻辑左移指定位数。

复制代码
1LSL R0, R1, #3      ; R0 <- R1 << 3

LSR (Logical Shift Right): 将一个寄存器中的值逻辑右移指定位数。

复制代码
1LSR R2, R3, #2      ; R2 <- R3 >> 2

2.5 比较和跳转指令

CMP:比较两个寄存器的值,并设置条件码。

复制代码
CMP R1, R2  ; 比较寄存器R1和R2的值

B (或BL ):无条件跳转到指定的地址(BL还会将返回地址保存在链接寄存器中)。

复制代码
B Label  ; 无条件跳转到Label标签处
B 0x12345678     ; 无条件跳转到绝对地址0x12345678
BL subroutine     ; 调用子程序subroutine,返回地址保存在LR

BEQBNEBGTBLT等:根据条件码的值跳转到指定的地址。

复制代码
BEQ Next  ; 如果相等,跳转到Next标签处
BNE Next  ; 如果不相等,跳转到Next标签处

CMP R0, R1        ; 比较R0和R1,更新条件标志
BGT label         ; 如果R0 > R1,则跳转到label

2.6 其他常用指令

NOP: 执行空操作,常用于占位、填充指令流水线或调试。

复制代码
NOP                ; 执行一个空指令周期

PUSH/POP: 在栈上压入/弹出多个寄存器的值。

复制代码
PUSH {R1, R2, R3}  ; 将R1、R2、R3的值依次压入栈
POP {R4, R5, R6}   ; 将栈顶的值依次弹出到R4、R5、R6

3 局部变量的分配与初始化

4 全局变量、静态变量初始化

5 栈和堆

6 函数

7 指针

8 结构体

9 联合体

10 位域

11 头文件

12 链表

相关推荐
电星托马斯14 分钟前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
march_birds6 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式6 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
jelasin7 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者7 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
神里流~霜灭9 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
双叶8369 小时前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏
钡铼技术物联网关10 小时前
ARM边缘计算时代:BLIoTLink如何打通设备互联任督二脉
arm开发·人工智能·边缘计算
艾妮艾妮10 小时前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
charlie11451419110 小时前
STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出
c语言·stm32·单片机·嵌入式硬件·gpio·数据手册