提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
目录
文章目录
前言
一、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处。
文章来源:https://www.toymoban.com/news/detail-540857.html
总结
LDR Rn,addr 第二个参数addr代表存储器中的地址。addr可以由[R0],R0中的值作为地址寻址。如果LDR R1,R0是不对的,应为寄存器之间搬移需要用MOV R1,R0指令。文章来源地址https://www.toymoban.com/news/detail-540857.html
到了这里,关于LDR指令解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!