)嵌入式linux之常用汇编指令(代码片段)

衾许° 衾许°     2022-12-02     623

关键词:

1.处理器内部数据传输指令

数据传输指令分为 一般寄存器间的数据传输或者 特殊寄存器与一般寄存器间的数据传输。
数据传输常用的指令有三个: MOV MRS MSR

 用法示例:

1 MOV 指令
MOV R0,R1 @将寄存器 R1 中的数据传递给 R0,即 R0=R1
MOV R0, #0X12 @将立即数 0X12 传递给 R0 寄存器,即 R0=0X12
2 MRS 指令
MRS R0, CPSR @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR
3 MSR 指令
MSR CPSR, R0 @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0

注:MRS 指令用于将特殊寄存器(CPSR SPSR)中的数据传递给通用寄存器,MSR 指令和 MRS 刚好相反,MSR 指令用来将普通寄存器的数据传递给特殊寄存器,也就是写特殊寄存器,写特殊寄存器只能使用 MSR.

我是这样记的:M开头就是传输指令,MOV最好记,MRS与MSR,R就是(READ)读取,强调读取操作,是读取特殊寄存器中的值。或者你可以认为MRS中R代表普通寄存器,S代表special特殊寄存器,而汇编都是反着读的。

2.存储器访问指令

ARM 不能直接访问存储器,比如 RAM 中的数据, I.MX6UL 中的寄存器就是 RAM 类型的,用汇编来配置 I.MX6UL 寄存器的时候需要借助存储器访问指令,一般先将要配置的值写入到Rx(x=0~12) 寄存器中,然后借助存储器访问指令将 Rx 中的数据写入到 I.MX6UL 寄存器中。读取 I.MX6UL 寄存器也是一样的,只是过程相反。常用的存储器访问指令有两种:LDR 和STR。

  用法示例:

1 LDR 指令
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, [R0] @读取地址 0X0209C004 中的数据到 R1 寄存器中
2 STR 指令
LDR R0, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=0X20000002
STR R1, [R0] @将 R1 中的值写入到 R0 中所保存的地址中

注:LDR 和 STR 都是按照字进行读取和写入的,也就是操作的 32 位数据,如果要按照字节、 半字进行操作的话可以在指令“LDR”后面加上 B H,比如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH STRH

我是这样记的:LDR和STR指令的作用我其实感觉有点抽象,因为一开始说的MOV,MSR,MRS指令其实就和他们作用貌似完全一致,区别就是LDR与STR是用于读取存储器中的数据的(RAM类寄存器)其实我有点蒙,在我印象里RAM和ROM类型存储介质的区别一个就是掉电丢失与掉电不丢失,另外寄存器加了[]貌似就如C中的取地址符号,这些也是要注意一下的,而STR指令也是唯一一个从右往左读的汇编指令。

3.压栈和出栈指令

A 函数中调用 B 函数,当 B 函数执行完以后再回到 A 函数继续执行要想再跳回 A 函数以后代码能够接着正常运行,那就必须在跳到 B 函数之前将当前处理器状态保存起来

B 函数执行完成以后再用前面保存的寄存器值恢复 R0~R15 即可。保存 R0~R15 寄存器的操作就叫做现场保护,恢复 R0~R15 寄存器的操作就叫做恢复现场。 在进行现场保护的时候需要进行压栈 ( 入栈 ) 操作,恢复现场就要进行出栈操作。

PUSH R0~R3, R12 @将 R0~R3 和 R12 压栈
PUSH LR @将 LR 进行压栈

处理器的堆栈是向下增长的, 栈区示意图:汇编从右往左读,入栈顺序为R12,R3,R2,R1,R0,LR

POP LR @先恢复 LR 
POP R0~R3,R12 @在恢复 R0~R3,R12
出栈的就是从栈顶,也就是 SP 当前执行的位置开始,地址依次减小来提取堆栈中的数据到要恢复的寄存器列表中。 我是这样记的:这个就没什么好说了,不懂栈数据类型的建议先补一下栈数据类型,只有PUSH和POP两个指令,比较简单。

4.跳转指令

有多种跳转操作,一般常用的还是 B BL BX。 1 B 指令
_start: 
ldr sp,=0X80200000 @设置栈指针
b main @跳转到 main 函数
2 BL 指令
push r0, r1 @保存 r0,r1
cps #0x13 @进入 SVC 模式,允许其他中断再次进去
bl system_irqhandler @加载 C 语言中断处理函数到 r2 寄存器中
cps #0x12 @进入 IRQ 模式
pop r0, r1 
str r0, [r1, #0X10] @中断执行完成,写 EOIR

注:BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。

5.算术运算指令

汇编中也可以进行算术运算, 比如加减乘除,常用的运算指令用法如下

主要讲解了一些最常用的指令,还有很多不常用的指令没有讲解 , 但是 够我 们后 续学习用了,要想详细的学习 ARM 的 所有 指令 请参 考《 ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》和《 ARM Cortex-A(armV7) 编程手册 V4.0.pdf 》这两份文档。

)嵌入式linux之常用汇编指令(代码片段)

1.处理器内部数据传输指令数据传输指令分为一般寄存器间的数据传输或者特殊寄存器与一般寄存器间的数据传输。数据传输常用的指令有三个:MOV、MRS和MSR 用法示例:1、MOV指令MOVR0,R1@将寄存器R1中的数据传递... 查看详情

arm汇编基础详解(代码片段)

...跳转指令2.5算术运算指令2.6逻辑运算指令前言我们在进行嵌入式Linux开发的时候是绝对要掌握基本的ARM汇编,因为Cortex-A芯片一上电SP指针还没初始化,C环境还没准备好,所以肯 查看详情

汇编基础之三--汇编指令(代码片段)

...的指令介绍:https://blog.csdn.net/bjbz_cxy/article/details/79467688常用的汇编指令有:mov指令,在内存中写入以一个数,将寄存器的值写入内存,将内存中的值写入寄存器。寄存器使用名称指定,内存使用一个内存地址编号指定。指令宽度... 查看详情

嵌入式linux应用开发之常用shell脚本总结(代码片段)

总结下日常工作中常用的linux下的shell脚本。linux的shell脚本很强大,可以用来做一些特殊功能。shell脚本语法虽然很简单,但是有时候把经常忘,还得再写一遍且验证ok才能用,这里总结下留作备忘。关于shell脚本... 查看详情

linux常用指令(代码片段)

...统,比Windows还高,他可以存在于服务器端,嵌入式设备(如:空调,卫 查看详情

linux驱动开发:arm汇编基础(代码片段)

...址寻址2.5多寄存器寻址2.6相对寻址2.7堆栈寻址三、Cortex-A常用汇编指令3.1处理器内部数据传输指令3.2存储器访问指令3.3压栈和出栈指令3.4跳转指令3.5算术运算指令3 查看详情

浅淡个人学习嵌入式linux过程(代码片段)

导读编写计算机程序所用的语言是人与计算机之间交换的工具,按语言对机器的依赖程度分为机器语言、汇编语言和高级语言。机器语言(MachineLanguage)机器语言是面向机器的语言,每一个由机器语言所编写的程序只适用于某种... 查看详情

markdown[ubuntu系统常用指令]#学习笔记#嵌入式系统#ubuntu(代码片段)

查看详情

指令速记(代码片段)

...-farsight/p/6068905.html使用仿真器ARMSimARM汇编模拟器参考文档嵌入式Linux学习笔记(基于S5PV210、TQ210)指令文档(gnu-assembler.pdf)标号标号,就是地址的值 查看详情

c++常用命令行开发工具(linux)(代码片段)

1、简介编译的四个阶段:预处理(扩展各个宏与文件)、编译(得到汇编代码)、汇编(得到机器码)、链接(得到可执行文件)预处理:编译处理宏定义等宏命令(eg:#define)——生成后缀为“.i”的文件  编译:将预处理... 查看详情

linux系统常用指令grepsed和awk(代码片段)

文章目录1概论2grep指令2sed指令2.1sed特点及格式2.2sed执行过程2.3sed核心应用3awk指令3.1awk执行过程3.2awk之行与列3.3awk之模式匹配3.4awk数组3.5awk循环与判断1概论命令特点场景grep过滤grep命令过滤速度是最快的sed替换,修改文件内... 查看详情

android逆向基础之arm汇编语言知识总结(代码片段)

...1.4代码识别1.5IDA示例ARM64汇编2.1寄存器2.2变址寻址方式2.3常用汇编指令2.4实例程序分析总结前言X86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称,包括Intel8086、80186、80286、80386以及80486等以86结尾系列,英特尔... 查看详情

《嵌入式-嵌入式大杂烩》arm汇编入门(代码片段)

我们在学习ARM的时候,一般都不用看汇编启动代码,直接使用芯片厂商提供的汇编启动代码,但是要想深入了解ARM内部原理,就必须掌握一定的汇编知识。我们在前面总结了处理器架构与指令集,那么汇编和... 查看详情

汇编指令之set(代码片段)

汇编set语句:实现无分支比较, 不断流水线39383E46|.83F909cmpecx,0x939383E49|.0F97C0setaalcmp比较两个操作数,结果保存在FLAG寄存器中(同sub运算,不同在于不影响操作数, 只影响flag寄存器)seta的a表示无符号数的above 大于,即(和条... 查看详情

linux常用指令(代码片段)

目录前言一.基本操作文件相关操作ls指令pwd命令cd指令tree指令stat指令touch指令mkdir指令rm指令cp指令mv指令man指令umask指令 file指令文件内容显示 echo指令cat指令tac指令 more指令less指令head指令tail指令查找 find指令 grep指令which指令... 查看详情

01linux常用指令(代码片段)

...t/tmp/dev/media/mnt/opt/usr/local/var1.3.路径1.4.空文件的大小二、常用的指令whoamilspwdcdtouchmkdirr 查看详情

万字详解linux常用指令(值得收藏)(代码片段)

...进程序员交流群👇👇本文将给大家详细介绍Linux常用的指令、演示以及一些基础知识的讲解目录ls指令file指令pwd命令whoami指令cd指令相对路径和绝对路径which指令touch指令mkdir指令添加用户信任关系rmdir指令rm指令man指令cp... 查看详情

[os-linux]linux的常用命令2(代码片段)

  本文主要以CentOS为例,介绍了一些Linux常用命令。目录15.时间相关的指令16.Cal指令 17.find指令:-name​18.grep指令20.tar指令21.bc指令:​22.uname–r指令:​23.关机24.其他常用 续[OS-Linux]Linux的常用命令1_RMA515T的博客... 查看详情