您的位置:首页 > 教程 > 汇编语言 > 汇编语言LDR指令和LDR伪指令详解

汇编语言LDR指令和LDR伪指令详解

2023-01-24 07:42:01 来源:易采站长站 作者:

目录
LDR指令和LDR伪指令详解ARM32位指令的构成ldr指令和ldr伪指令的使用区别:补充1:补充2:汇编语言ldr伪指令

LDR指令和LDR伪指令详解

ARM32位指令的构成

ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。>

ldr指令和ldr伪指令的使用区别:

ldr>ldr r0, 0xFFFF @指令
直观的区别就是ldr伪指令使用时,后面的数据前会有"=",实际使用时,大部分都使用伪指令,这样就不用考虑合法和非法立即数的问题。在编译的时候,编译器会将ldr伪指令进行替换,用文字池的方式来解决非法立即数的问题。文字池就是划分出一段地址空间用来存放常量或者地址,需要时用基址+变址的方式去取数据,这样就不用受到合法立即数的限制,可以表示32bit的数据。例如:
汇编源代码:
_start:
ldr r0, =0x11111111
经过反汇编:
00000000 <_start>:
0: e59f009c ldr r0, [pc, #156] ; a4 <delay_loop+0x10>
·
·
·
98: e1520003 cmp r2, r3
9c: 1afffffc bne 94 <delay_loop>
a0: e1a0f00e mov pc, lr
a4: 11111111 tstne r1, r1, lsl r1
分析:
通过反汇编可以看到,ldr伪指令被一条寄存器基址变址指令给替代了。其中以pc为基址,偏移156个字节(16进制是0x9c)。这条指令的作用是将内存地址"pc + 156"开头的4个字节读取到r0中,此时pc的值等于当前执行指令的地址+8(因为流水线的原因),因此pc + 156 = 0xa4,而0xa4地址处存的值刚好是0x11111111。这样就完成了将0x11111111加载到r0。

补充1:

RAM处理器存在流水线,目前已经有十几级流水线,但是ARM为了兼容,无论Soc有多少级流水线,PC的值都是等于当前指令地址>

补充2:

汇编语言ldr伪指令

伪指令是用来自动拆分代码值的,会把一条语句拆分成多条语句。

示例:

/* 汇编点亮一个 LED 灯 */

.text
.global _start

_start:
    ldr r1, =0x56000050
    ldr r0, =0x100  /* 相当于 mov r0, #0x100 */
    str r0, [r1]

    ldr r1, =0x56000054
    ldr r0, =0 /* mov r0, #0 */
    str r0, [r1]

halt:
    b halt

ldr r1, =0x56000054就是一条伪指令,假设我们想把56000054值给r1寄存器,可以用 mov r1, #56000050 ,
但是长度超出了mov 能接收的长度,就要分为高低字节去发送,但是在某些时候我们还要去看开放文档,才能知道
或者没有开发文档,那就让伪指令自己去判断。

到此这篇关于汇编语言LDR指令和LDR伪指令详解的文章就介绍到这了,更多相关汇编语言ldr伪指令内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!

如有侵权,请发邮件到 [email protected]

相关文章

  • 通过汇编看golang函数的多返回值问题

    通过汇编看golang函数的多返回值问题

    golang这门语言,有个比较好的特性,就是支持函数的多返回值。想C,C++,Java等这些语言,是不支持函数多返回的。但是C,C++可以使用传递指针,实现函数多返回。但是,你有没有想过
    2020-06-22
  • 汇编语言程序设计之根据输入改变屏幕颜色的代码

    汇编语言程序设计之根据输入改变屏幕颜色的代码

    写在前面 该程序实现了“根据输入改变屏幕颜色”。其实这个程序本身没什么意思,纯粹只是将学习到的知识融合在了一起而已。程序本身过于繁琐了,写得并不是很好。以及这是我汇
    2020-03-12
  • 汇编语言 跳转指令与C语言的条件分支

    汇编语言 跳转指令与C语言的条件分支

    跳转指令 跳转指令也是一个组的指令,称为j组。其中jmp为无条件跳转,其余为条件跳转 上图为j组指令,可结合条件码访问指令加深理解 在机器指令水平上理解如何对跳转指令编码 如
    2020-03-26
  • Go 中的循环是如何转为汇编的(方法详解)

    Go 中的循环是如何转为汇编的(方法详解)

    本文基于 Go 1.13 版本 循环在编程中是一个重要的概念,且易于上手。但是,循环必须被翻译成计算机能理解的底层指令。它的编译方式也会在一定程度上影响到标准库中的其他组件。让
    2020-05-06
  • 服务器Centos部署MySql并连接Navicat过程详解

    服务器Centos部署MySql并连接Navicat过程详解

    (1)服务器配置:[[email protected] ~]# cd /usr/local/src/[[email protected] src]# wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm [[email protected] src]# rpm -ivh mysql57-community-release-el7-
    2020-07-24
  • Tomcat启动springboot项目war包报错:启动子级时出错的问题

    Tomcat启动springboot项目war包报错:启动子级时出错的问题

    今天公司springboot项目准备部署到测试服务器上进行测试,打包好war后放到tomcat里面启动后,前端文件能访问到,但是接口请求一直是404,一直找了很久的原因,tomcat启动是成功的,war打包的时候也提示build success了,tomcat启动日志发现报错:java.lang.IllegalStateException: 启动子级时出错 at org.apache.catal
    2020-08-08
  • spss如何进行显著性差异分析

    spss如何进行显著性差异分析

    spss进行显著性差异分析的方法:首先打开spss软件选择需要的数据;然后右击选择一般线性模型,并选择单变量;接着将变量分别对应移至因变量和协变量,并选择参数估算值;最后单击选项中的继续选项即可。spss进行显著性差异分析的方法:1、首先我们打开SPSS版本23.0软件,找到想要进行编辑处理的数据,这里以药物对身高的影响做显著性分析2、找到上方菜单栏中的分析菜单,鼠标移动至一般线性模型,然后选择单
    2020-08-28
  • 技嘉AORUS GeForce RTX 3080 XTREME 10G大雕怎么样

    技嘉AORUS GeForce RTX 3080 XTREME 10G大雕怎么样

    “加量不加价”可以说是从9月NVIDIA正式发布GeForceRTX30系显卡以来,DIY硬件圈最为流行的梗。这个梗流行背后,一方面源于玩家对于硬件性能极致追求、却苦于囊中羞涩的真实写照,另一方面更展现了此次NVIDIA30系显卡带给玩家和业界的梦幻升级。从公版发售开始,NVIDIA30系就被玩家冠以“真香”的名号,全新升级的第二代RTX架构NVID
    2020-12-21