arm 汇编积累

C语言函数与汇编对应关系

一、MOV 系列指令

1、指令格式

MOV{条件}{S} 目的寄存器,源操作数

2、含义解析:

(1):mov 指令传送数据

案例:

MOV R0,R1 ; R0 = R1;

MOV PC,R14 ;PC = R14;

MOV R0,R1,LSL#3 ;R0=R1<<3;

(2):movs

s(s标志)功能不变,影响CPSR标志位

movs r0, #0 默认结果为零但不影响CPSR的Z位,加上s以后会影响CPSR标志位

N[31]:负的条件标记 T[5]:决定的是用的是ARM指令集还是Thumb指令集

Z[30]:零的条件标记 A[6]:异常终止的频闭位

C[29]:操作进位 I [7]:中断的频闭位

V[28]:操作溢出 F[8]:快速中断的频闭位

E[9]: 大小端序的设置

二、LDR 与 STR 系列命令

1、LDR 命令

// 格式:LDR{条件} 目的寄存器,<存储器地址>

LDR R0,[R1] // 将存储器地址为R1的字数据读入寄存器R0

LDR R0,[R1,R2] // 将存储器地址为R1+R2的字数据读入寄存器R0

LDR R0,[R1,#8] // 将存储器地址为R1+8的字数据读入寄存器R0

LDR R0,[R1,R2]! // 将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1

LDR R0,[R1,#8]! // 将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1

LDR R0,[R1],R2 // 将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1

LDR R0,[R1,R2,LSL#2]! // 将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1

LDR R0,[R1],R2,LSL#2 // 将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1

LDR R1, =0x00000001 ; 把内容 0x00000001 写入 R1 寄存器。

LDR R1,0x00000002 ; 把内存地址 0x00000002 里的内容转到 R1 中。

MOV 与 LDR 的区别:

mov

++1.用于寄存器和寄存器之间传递数据++

++2.把立即数(立即数表示数值的数字,前面加#)传递给寄存器++

str/ldr

可以用于寄存器与内存之间的数据交换,STR是将寄存器中的数载入内存,LDR是将内存中的数载入到寄存器,LDR可以载入立即数。

2、STR 命令

// 格式:STR{条件} 源寄存器,<存储器地址>

STR R0,[R1],#8 // 将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1

STR R0,[R1,#8] // 将R0中的字数据写入以R1+8为地址的存储器中

三、多内存操作指令(此部分为借鉴,多谢博主)

指令格式 : <opcode><cond> Rn{!} {register_list}

Rn 中保存一个 内存地址值

{!} 表示是否更新 Rn 中的地址值

{register_list} 寄存器列表

1. 【 stm 】 多个寄存器中的值写入内存中

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
ldr r4, =0x44444444
stm r0!, {r1,r2,r3,r4}   @ 把 此条指令改为 stm r0,{r1,r2,r3,r4} 不会更新r0中的地址值

对于多个寄存器的操作指令【stm】说明:

(1)加 ! 表示更新 r0 中的地址值

(2)寄存器列表中是连续的寄存器可以用 - 连接 如 {r1, r2, r3, r4, r6} 可以表示为 {r1-r4, r6}

(3)编号晓得寄存器数据,保存到低地址中

(4)编号大的寄存器数据,保存到高地址中

2. 操作多个寄存器 读内存数据

mov r0, #0x40000000
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333
stm r0, {r1-r3}  @把寄存器 r1-r3 中的值写入 r0 指向的内存地址中

ldm r0!, {r5-r7} @读出r0指向的内存地址中的放在寄存器 r5-r7 中

四、栈操作指令 【入栈: stmfd,出栈:ldmfd 】

栈的 4 种特性 Full满栈 Empty空栈 Ascend增栈 Descend降栈

组合 4 种栈:

stmfa fa 满 增

stmfd fd 满 降 ARM 汇编默认使用

stmea ea 空 增

stmed ed 空 减

指令格式:<opcode><cond> sp! {register_list} : sp 堆栈指针 r14

ldr sp, =0x40000100   @初始化栈指针
ldr r1, =0x11111111
ldr r2, =0x22222222
ldr r3, =0x33333333

stmfd sp!, {r1-r3}    @把数据 入栈 到sp指向的地址, 增满栈类型, sp指针跟着更新
ldmfd sp!, {r4-r6}   @出栈, 把栈内数据弹出到 r4-r6寄存器中

案例:

ldr sp, =0x40000100  @初始化栈指针
   mov r0, #0x12
   mov r1, #0x11
   bl add_fun
   mov r2, #0x22
   mov r3, #0x33
   b loop

   add_fun:
       stmfd sp!, {r0-r3, lr} @ 入栈 r0-r3 ,lr指向跳转此处的吓一跳指令,也就是跳转到 , 第5行
       mov r0, #0x1
       mov r1, #0x2
       add r4, r0, r1
       ldm sp!, {r0-r3, pc} @ 出栈,把 lr 的地址弹到 pc指针中执行
   loop:
       b loop
相关推荐
Tlog嵌入式10 小时前
蓝桥杯【物联网】零基础到国奖之路:十六. 扩展模块之矩阵按键
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
Q8343158191 天前
华为 海思22AP10(SS524)H.265 编解码处理器用户指南
arm开发·人工智能·嵌入式硬件·音视频·硬件工程·h.265·视频编解码
星羽空间1 天前
win11下 keil报错Cannot load driver ‘D:\Keil_v5\ARM\Segger\JL2CM3.dll‘
arm开发·keil
日晨难再1 天前
AMBA:APB的历史(从APB1到APB5)
arm开发·arm·硬件工程·fpga·数字ic
Tlog嵌入式2 天前
蓝桥杯【物联网】零基础到国奖之路:十八. 扩展模块之光敏和AS312
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
汽车电子助手2 天前
【STM32开发环境搭建】-4-在STM32CubeMX中新增Keil(MDK-ARM) 5的工程目录(包含指定路径的C和H文件)
c语言·arm开发·stm32·stm32cubemx·keil
海滩游侠2 天前
ARM Assembly 6: Shift 和 Rotate
arm开发
htx nb3 天前
ARM 架构、cpu
arm开发
极客小张3 天前
基于STM32的远程工业控制系统架构设计:MQTT通信、React界面与FreeRTOS优化的综合应用
c语言·arm开发·stm32·物联网·算法·react.js·毕业设计
勾栏听曲_03 天前
ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)
c语言·arm开发·单片机·嵌入式硬件·硬件工程