当前位置:网站首页 > R语言数据分析 > 正文

ldrb指令什么意思(ldrb是什么指令)



文章目录

  • ARM裸机开发:ARM汇编基础
  • 一、GUN汇编语法
  • 1.1 语句结构:
  • 1.2 伪操作
  • 1.3 GUN函数
  • 二、 ARM的寻址方式
  • 2.1立即寻址
  • 2.2寄存器寻址
  • 2.3寄存器间接寻址
  • 2.4基址变址寻址
  • 2.5多寄存器寻址
  • 2.6相对寻址
  • 2.7堆栈寻址
  • 三、Cortex-A常用汇编指令
  • 3.1 处理器内部数据传输指令
  • 3.2 存储器访问指令
  • 3.3 压栈和出栈指令
  • 3.4 跳转指令
  • 3.5 算术运算指令
  • 3.6 逻辑运算指令

本期正文:

芯片在上电后,最开始并没有运行C语言的环境,需要通过汇编程序来运行配置,直到能够运行C语言后在开始切换到C语言运行环境,这段代码文件也叫启动文件,对学习驱动开发来说,汇编非常有必要学习一下!因为I.MAX是Cortex-A内核的芯片,所以主要了解Cortex-A的汇编指令

因为我们编译器使用的是 GUN cc(GCC)交叉编译器,用来在当前平台上编译其他平台的代码,他有着自己的语法规范,所以我们编写Cortex-A的汇编代码时要符合GUN的语法规范!

GNU汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成, 每行一条语句,每条语句有三个可选部分,如下:

语句组成:

示例

add是标号,表示指令地址,后面可以通过标号进行跳转,MOV R0 ,#0x12将立即数赋值给R0寄存器

@设置 R0=0X12为注释,不参与编译

除了指令之外,汇编还有伪操作和为指令,两者区别如下

伪操作,其操作对象是汇编编译器;而伪指令,其最终的操作对象是指令,也就是说,其对应的是用于CPU执行的指令。这就是他们之间简单但很微妙的区别。

伪指令最终面对的是CPU指令集的指令。伪操作是用来控制汇编器是如何来产生汇编指令的。

ARM 中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用小写,但是不能大小写混用!

用户可以使用.section(伪操作)来定义一个段,汇编系统预定义了一些段名如下:(部分)

每个段以段名开始,以下一段名或者文件结尾结束

我们可以在编写汇编中使用这些预定义的段,完成一些功能,比如汇编程序的默认入口标号是start,不过我们也可以在链接脚本中使用 ENTRY 来指明其它的入口点,下面的代码就是使用start 作为入口标号

.global个全局标号,类似 C 语言里面的全局变量一样,声明之后,.global _start 让start符号成为可见的标示符,这样链接器就知道跳转到程序中的什么地方并开始执行,linux寻找这个 _start标签作为程序的默认进入点

除此之外我们也可以自定义伪操作,使用.section来定义一个段,,例如

GUN语法支持函数,函数格式如下:

比如Cortex-A7的中断服务函数

例如 “SVC_Handler” 就是函数名,“ldr r0, =SVC_Handler”是函数体,“bx r0”是函数 返回语句,“bx”指令是返回指令,函数返回语句不是必须的

寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式,目前ARM指令系统支持以下几种寻址方式:立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址

也称为立即数寻址,这种寻址方式指令中就已经给出了操作数。也就是在执行指令的过程中,处理器取得指令的同时也取得了操作数,因此称为立即数寻址。例如:

其中源操作数就是立即数,要求以“#”开始,对于十六进制的立即数,要求在“#”后面加“0x”或“&”。

将寄存器中的数值作为操作数,是各类微处理器常用的寻址方式,也是效率较高的寻址方式。例如:

寄存器间接寻址是以寄存器中的值作为操作数的地址,操作数本身存放在寄存器中。例如:

[R0]表示以R0寄存器的值为地址的值作为实际值

R0表示寄存器的值作为实际值

基址变址寻址是把基址寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。该方式常用于访问基地址附近的某些存储单元,一般有以下几种方式:

将寄存器R1的值加上4作为操作数的有效地址,取得操作数后存入R0中,代码如下

将寄存器R1的值加上4作为操作数的有效地址,取得操作数后存入R0中,然后寄存器R1的值加上4个字节,代码如下

将寄存器R1的值作为操作数的有效地址,取得操作数后存入R0中,然后寄存器R1的值加上4个字节,代码如下

将寄存器R1和R2的值相加作为操作数的有效地址,取得操作数后存入R0中,代码如下

使用多寄存器寻址,一条指令可以完成多个寄存器值的传送,一条指令最多可以传送16个通用寄存器的值。例如:

该指令后缀IA表示每次执行完读取/存储操作后,R0按字长增加,因此,指令可以将连续存储单元的值传送到R1~R4。

与基址变址寻址类似,相对寻址以程序计数器PC的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加后得到操作数的有效地址。以下程序完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

堆栈是一种数据结构,按先进后出的方式工作,使用一个称为堆栈指针的专用寄存器指示当前的操作,堆栈指针总是指向堆栈顶端。

  1. 当堆栈指针指向最后压入的数据时,称为满堆栈;
  2. 当堆栈指针指向下一个将要压入的位置时,称为空堆栈。

根据堆栈的生成方式,可分为递增堆栈和递减堆栈。当堆栈由低地址向高地址生成时,称为递增堆栈,反之称为递减堆栈。排列组合后可得到4中类型的堆栈工作方式,ARM微处理器支持全部4种类型的堆栈工作方式,如下:

  • 满递增堆栈:堆栈指针指向最后压入的数据,由低地址向高地址生成。
  • 满递减堆栈:堆栈指针指向最后压入的数据,由高地址向低地址生成。
  • 空递增堆栈:堆栈指针指向下一个将要压入数据的空位置,由低地址向高地址生成。
  • 空递减堆栈:堆栈指针指向下一个将要压入数据的空位置,由高地址向低地址生成

处理器内部数据传输主要有以下三个操作:

  1. 将数据从一个寄存器传递到另外一个寄存器
  2. 将数据从一个寄存器传递到特殊寄存器,如 CPSR 和 SPSR 寄存器
  3. 将立即数传递到寄存器

常用指令有:

  • MOV指令

MOV 指令用于将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面

  • MRS指令

MRS 指令用于将特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器,要读取特殊寄存器的数据只能使用 MRS 指令

  • MSR 指令

MSR 指令用来将普通寄存器的数据传递给特殊寄存器,也就 是写特殊寄存器,写特殊寄存器只能使用 MSR

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

  • LDR指令

LDR 主要用于从存储器加载数据到寄存器 Rx 中,LDR 也可以将一个立即数加载到寄存器 Rx 中LDR 加载立即数的时候要使用“=”,而不是“#”。在嵌入式开发中,LDR 最常用的就是读 取 CPU 的寄存器值,比如 I.MX6UL 有个寄存器 GPIO1_GDIR,其地址为 0X0209C004,要读取这个寄存器中的数据,代码如下

  • STR 指令

STR 就是将数据写入到存储器中,同样以 I.MX6UL 寄存器 GPIO1_GDIR 为例,现在我们要配置寄存器 GPIO1_GDIR 的值为 0X,示例代码如下

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

函数在运行时,临时存储数据的寄存器是R0-R15,函数运行结束或者切换的时候,需要保存当前运行的参数(保护现场),即把当前寄存器的数据通过SP指针压入到堆栈里面,进行保存,当函数继续运行时,则将原先保存在堆栈的数据弹出到当前R0-R15中(恢复现场)继续运行;。压栈 的指令为 PUSH,出栈的指令为 POP,PUSH 和 POP 是一种多存储和多加载指令(就是实际上执行多条指令),即可以一次 操作多个寄存器数据,他们利用当前的栈指针 SP 来生成地址,PUSH 和 POP 的用法如表:

假如我们现在要将 R0~R3 和 R12 这 5 个寄存器压栈,当前的 SP 指针指向 0X,处理器的堆栈是向下增长的,使用的汇编代码如下:

压栈后的堆栈SP指针如下:

支持arm架构windows 10_堆栈

如果我们要出栈的话 就是使用如下代码:

出栈的就是从栈顶,也就是 SP 当前执行的位置开始,地址依次减小来提取堆栈中的数据 到要恢复的寄存器列表中,PUSH 和 POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”,功能和上面的相同

跳转一般有两种操作:

  1. 直接使用跳转指令 B、BL、BX 等
  2. 直接向 PC 寄存器里面写入数据

指令跳转:

  • B指令

B 指令会将 PC 寄存器的值设置为跳转目标地址, 一旦执行 B 指 令,ARM 处理器就会立即跳转到指定的目标地址,一般用于不会返回的跳转,如下为启动程序完成后最后跳转到main函数开始执行C语言程序!

  • BL指令

BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以 通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行,一般用于需要返回的跳转,比如子程序调用,或者进入中断的情况,如下就是进入中断跳转

汇编中也可以进行加减乘除算术运算,指令如下:

汇编中也有C语言中的逻辑运算,比如与运算或运算等等,具体如下表

&为与,|为或,~为按位取反,^为异或,! 为取反

到此这篇ldrb指令什么意思(ldrb是什么指令)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • treeplan破解版(treeplan下载)2025-10-19 14:45:09
  • hprof文件打开报错(hprof文件怎么打开)2025-10-19 14:45:09
  • treeplan破解版(tree world安卓破解版)2025-10-19 14:45:09
  • comix客服(comfpro客服)2025-10-19 14:45:09
  • treeswap官网(treechada官网)2025-10-19 14:45:09
  • crnn是什么(crnn全称)2025-10-19 14:45:09
  • treesize free安装出现错误(tree命令安装包)2025-10-19 14:45:09
  • linux中rpm和yum仓库的区别(rpm与yum软件仓库的作用)2025-10-19 14:45:09
  • spark面试题以及答案(spark 面试题)2025-10-19 14:45:09
  • pointnet++网络的改进(point network网络)2025-10-19 14:45:09
  • 全屏图片