LDR指令解析

这篇具有很好参考价值的文章主要介绍了LDR指令解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

目录

文章目录

前言

一、LDR指令是什么

二、代码分析

1.示例代码

总结



前言

ARM中LDR使用频繁,初上手会有些理解困难的地方,本文章结合一段小代码解析LDR指令的使用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、LDR指令是什么

LDR Rn, label1

LDR指令负责将label1所代表的存储器中数据搬移到内部寄存器Rn中。指令使用方式有:

LDR R0,[R1] ;R1中代表存储器地址,在存储器中将R1地址处的数据加载到寄存器R0中。

LDR R0,=0x00000040 ;将立即数装入R0中,如果立即数小,该指令等效 MOV R0,#64,如果立即数很大比如占据32bit,那么该指令将变成伪指令,见下条。

LDR R0,=0xF0000000 ;立即数很大,无法将立即数和指令合并成32bit,指令会被编译器拆分为LDR R0, [PC, #offset]; .word 0xF00000000两条指令,即先将立即数利用.word指令存储在该LDR指令附近,编译器计算立即数与当前正在执行指令PC(program counter)指针的偏差offset,注意ARM是流水线指令,采用取指令,译指令和执行指令。

LDR R0,label;将label标号所代表的寄存器地址中数据装在到R0。

二、代码分析

1.示例代码

代码如下(示例):

.text
.global _start
_start:
    LDR r0,=0x00001000  
    LDR r0,abc
abc: .word 0x00000040
    LDR r0,whs
whs: .word abc
/* no use code below*/
mov r0,r1
mov r1,r0
loop:
    b loop

 反汇编后的代码

start.elf:     文件格式 elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:    e3a00a01     mov    r0, #4096    ; 0x1000
   4:    e51f0004     ldr    r0, [pc, #-4]    ; 8 <abc>

00000008 <abc>:
   8:    00000040     andeq    r0, r0, r0, asr #32
   c:    e51f0004     ldr    r0, [pc, #-4]    ; 10 <whs>

00000010 <whs>:
  10:    00000008     andeq    r0, r0, r8
  14:    e1a00001     mov    r0, r1
  18:    e1a01000     mov    r1, r0

0000001c <loop>:
  1c:    eafffffe     b    1c <loop>

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:    00001e41     andeq    r1, r0, r1, asr #28
   4:    61656100     cmnvs    r5, r0, lsl #2
   8:    01006962     tsteq    r0, r2, ror #18
   c:    00000014     andeq    r0, r0, r4, lsl r0
  10:    412d3705             ; <UNDEFINED> instruction: 0x412d3705
  14:    070a0600     streq    r0, [sl, -r0, lsl #12]
  18:    09010841     stmdbeq    r1, {r0, r6, fp}
  1c:    地址 0x000000000000001c 越界。

 LDR r0,=0x00001000 对应0: e3a00a01 mov r0, #4096装载立即数且立即数很小,可直接对应MOV指令0:e3a00a01代表存储器地址0x00000000处存有指令e3a00a01,占用4字节。

LDR r0,abc对应4:e51f0004 ldr r0, [pc, #-4]; 8 <abc> 标号label abc编译后数值为8(0x00000008)因为ARM是取指-译指-执行指令流水线结构,当LDR r0,abc位于地址4处执行指令时,当前PC应该等于0xC处,所以PC,#-4应该等于8,正好是我们立即数0x00000040的存储地址。

LDR r0,whs 和whs: .word abc这两个指令在编译完成后变成LDR r0,whs whs和.word 0x8

立即数0x8也就是abc编译后确定的值,即abc=0x8存储在 10:  00000008处,也就是地址0x10处。


总结

LDR Rn,addr 第二个参数addr代表存储器中的地址。addr可以由[R0],R0中的值作为地址寻址。如果LDR R1,R0是不对的,应为寄存器之间搬移需要用MOV R1,R0指令。文章来源地址https://www.toymoban.com/news/detail-540857.html

到了这里,关于LDR指令解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LDR6328助力Type-C普及,便捷充电,绿色生活更精彩

    随着科技的进步和全球统一接口的需求, Type-C 接口正日益受到青睐。越来越多的设备正选择采纳这一先进的接口设计,它的普及无疑在改善着我们的日常生活。 在过往,许多小功率设备如小风扇、蓝牙音箱、桌面台灯以及家用加湿器等,都普遍采用 DC 圆头供电方式。尽管这

    2024年04月12日
    浏览(44)
  • iPhone15系类LDR6020P 超简外围手机转接器/拓展坞方案

    目前市面上的手机大部分已经取消3.5音频耳机接口,仅仅保留了Type-c口。但是追求音质和零延迟的用户仍然会选择3.5mm有线耳机,因为在玩手机游戏的时候,音画不同步真的很影响游戏体验,所以Type-C转3.5mm接口线应运而生。 #iPhone15将全系采用C口#最新款iPhone 15必须要采用Ty

    2024年02月07日
    浏览(36)
  • VL171 VL170配合LDR6020的type-c母座显示器方案

    兼容基于VASEL控制引脚的10 Gbps USB3.2 Gen2和AM所有4通道视频,包括DP1.4 8.1 Gbps VL171配合LDR6020实现的type-c桌面显示器方案电路 LDR6020是一个DRP的PD芯片,PD芯片与主机通讯完之后,通过PD芯片去控制VL171实现正反插与USB信号和DP信号的分配

    2024年01月18日
    浏览(48)
  • 分享一颗能用在TYPE-C接口取电协议芯片LDR6328Q,方便好用

    芯片封装:QFN16,SOP8多封装选择 芯片应用: 桶形连接器替换(BCR),USB-A和micro-B替换。TYPE-C转DC TYPE-C(USB-C)转接线转接头(TYPE-C转传统笔记本充电口,如USB-C转联想方口,USB-C转戴尔/惠普圆口,USB-C转苹果扁口等)。 需要及时供电或充电的手持式设备,可充电设备,小家电等

    2024年02月13日
    浏览(38)
  • 无线充,大功率小家电,智能家居,无人机快速充电等产品供电 LDR6328S芯片TYUPE-C PD诱骗电压 USB-C解决PD电源取电问题

    LDR6328S 是乐得瑞科技有限公司开发的一款兼容 USB PD、QC 和 AFC 协议的 Sink 控制器。 LDR6328S 从支持 USB PD、QC 和 AFC 协议的适配器取电,然后供电给设备。比如可以配置适配器输 出需要的功率,给无线充电器设备供电。LDR6328S 也兼容传统 USB 电源适配器 。 LDR6328S PD诱骗协议芯片

    2024年02月04日
    浏览(50)
  • 【架构】探索计算机处理器的世界:ARM和x86架构解析及指令集

    计算机处理器是数字化时代的核心引擎,而在众多处理器架构中,ARM和x86是备受关注的三个。本文将带您深入探索这三个架构,介绍它们的特点、公司背景以及应用领域。让我们一起揭开计算机处理器的神秘面纱吧! ARM(Advanced RISC Machines)是一种计算机指令集架构(ISA),

    2024年02月11日
    浏览(44)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(49)
  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 下篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 在ARM汇编中,\\\" org \\\"是一个汇编器伪指令,用于设置下一条指令的装入地址。\\\" org \\\"后面跟着的是一个表达式,这个表达式的值就是下一条

    2024年02月14日
    浏览(50)
  • 【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】

    上篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 下篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) ARMv8 在硬件层名引入了一个新的 zero 寄存器 : XZR (64-bits), WZR (32-bits)。比如要将某一变量赋值为0x0, 由于ARM不允许直接操作内存单元上的数据

    2024年02月15日
    浏览(101)
  • ARM 汇编比较指令-条件执行指令

    比较指令用来比较两个数大小,或者是否相等,比较指令的运算结果会影响CPSR寄存器的NZC、V标识位,具体的标志位可以参考前面的CPSR寄存器介绍,比较指令的格式如下/ CMP {cond} Rn, operand2 比较两个数大小 CMN {cond}Rn, operand2 取负比较  比较指令的使用示例及说明如下。

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包