您的位置 首页 开关

ARM数据加载与存储指令 (二)

接上ARM数据加载与存储指令(一)完成下列任务1.阅读程序exp6_2.s,写出程序的功能。设置代码段的基地址为0x8000。用AXD单步调试程序,观…

接上ARM数据加载存储指令 (一)

完结下列使命
1.阅读程序exp6_2.s,写出程序的功用。设置代码段的基地址为0x8000。用AXD单步调试程序,调查每履行一步今后,相应的寄存器和存储器的改变状况,完结表格。
翻开的process view窗口如下:register,disassembly,low lever symbols,memory

序号 履行指令 指令履行后改变状况
寄存器 存储器
R0 R1 R2 R3 R4 SP PC 0x8024 0x8028 0x802C 0x8030 0x8038
0 0x0 0x0 0x0 0x0 0x0 0x0 0x8000 0x20 0x62 0x69 0x67 0x21
1
2
3
4
5
6
7
8
9
10


答案:
1.程序的功用是核算给定数据各项和的平均值,办法是先将数据各项加载到寄存器中,然后运用数据处理指令核算,最终再讲成果存入寄存器中。

一、 归纳编程
1.绘图剖析多寄存器传送指令的各种形式,并规划程序验证。(学生作业)
IA:
数据开始地址:0x800C

0x800C 0x10
0x8010 0x20
0x8014 0x30
R0 R1
0x10 0x20


DB:
数据开始地址:0x8010

0x8010 0x10
0x8014 0x20
0x8018 0x30
R0 R1
0x10 0x20


FD:
数据开始地址:0x800C

0x800C 0x10
0x8010 0x20
0x8014 0x30
R0 R1
0x10 0x20


EA:
数据开始地址:0x8010

0x8010 0x10
0x8014 0x20
0x8018 0x30
R0 R1
0x10 0x20


二、 留意事项 (程序中加载常量和地址的办法)
实践编程的过程中,常需求把当即数常量和地址值载入寄存器,因为指令集长度的约束和存储/加载体系结构的特色,这两个问题需求专门阐明。

差异:
START LDR R0,START 把START相对应的地址值的存储单元里的数据加载到R0,这条指令的结构便是R0里存储的是指令LDR R0,START对应的二进制代码。
LDR R0,=SRART 把START相对应的地址值加载到R0
ADR R0,START 把START相对应的地址值加载到R0


1. 加载常量到寄存器
(1) 运用MOV或MVN指令直接加载
直接加载任何取值在0x0~0xFF间的8位常量。
对上述的取值进行循环右移偶数次后的数值n
比如: MOV R1,#0x250

(2) 运用一种伪指令格局加载
运用一个LDR指令和在数字量前的等号,就能够很容易地将常量写入代码。
比如:LDR R1,=0x520
假如结构的常量能用MOV或许MVN指令加载,那么汇编器会选用恰当的指令;不然,汇编器会发生一个带PC相对偏移地址的LDR指令来从文字池中读取常量。
文字池是为常量留出的一部分内存。
默许状况:在END指示的方位。在4kB规模内。
例6.1 [B1] 加载常量值(example1.s)
AREA example1,CODE
ENTRY
START
MOV R0,#0xFF ; (1)
MOV R0,#0xFF0 (2)
LDR R2,=0xFF0 ;(3)
LDR R3,=0x5C34D77D ;(4)

STOP
程序解读
(1) 常量在0x0~0xFF之间,能够选用MOV指令直接加载
(2) 常量0xFF0是将0xFF循环右移28位后的值,相同能够选用MOV指令直接加载。
(3) 常量0xFF0取值在MOV或MVN指令所能加载的取值规模之内,在AXD中经过反汇编能够看到汇编器发生了以下代码 MOV R2,#0xFF0
(4) 常量0x5C34D77D超出了取值规模,所以汇编器用DCD分配了一个字的内存来寄存常量。这段内存便是一个文字池,其地址是0x8020。在ADX中经过反汇编能够看到汇编发生的一下代码印证了这一点。
LDR R3, #0x00008020 ;=#0x5C34D77D

0x8020 DCD 0x5C34D77D

2. 加载地址到寄存器
程序中常常要加载某个地址到寄存器中,伪指令ADR和ADRL的功用便是将一个寄存器相关表达式或程序相关表达式的地址存入寄存器中。
(1)用ADR或ADRL直接加载
所谓程序相关表达式便是标号相对于当时PC的偏移地址,而寄存器相关表达式便是标号相对于保存在指定的通用寄存器中的地址。一般的格局是:
ADR Rn,label
ADRL Rn,label

例6.2加载地址
AREA example2,CODE
ENTRY
START
ADR R0,START ;(1)
ADR R1,ADDR ;(2)
ADRL R2,ADDR+1000 ;(3)

STOP
B STOP
ADDR DCD 0x12345678
END
程序解读
(1) 代码(1)在AXD中经过反汇编能够看到汇编器发生以下代码
SUB R0,PC,#8 ;#0x8000
(2) 代码(2)在AXD中经过反汇编能够看到汇编器发生了一下代码
ADD R1,PC,#0x10 ;#0x801C
(3) 代码(3)在AXD中经过反汇编能够看到汇编器发生了一下代码
ADD R1,PC,#0x300 ;#0x8310
ADD R2,R2,#0xF4
因为标签ADDR的地址是0x801C,所以以上汇编器发生的指令将地址正确地加载到了寄存器中。

(2)运用一种伪指令格局加载(LDR)
留意:这儿的LDR是伪指令,与加载指令不同。
LDR Rd,=label
与前述运用LDR指令加载常量到寄存器类似,这种格局也能够加载程序相关表达式到寄存器。实践上,汇编器会把label的地址放入文字池,并发生一个LDR指令从文字池上读取地址。

例6.3 加载label地址
AREA example3,CODE
ENTRY
START
BL ARNEW
STOP
B STOP
ARNEW
LDR R0,=START ;(2)
LDR R1,=ARNEW ;(3)
LDR R2,=ARNEW+100 ;(4)
END
(1) 这段程序将数值0x20026、START地址、ARNEW地址和ARNEW地址+100都放入了文字池,这样文字池就变成了

地址 数据
0x8020 0x20026
0x8024 0x8000
0x8028 0x8010
0x802C 0x8074

即在文字池的偏移地址为4处寄存着START地址,偏移地址为8处寄存着ARNEW地址,偏移地址为12(0xC)处寄存着ANREW+100地址。
(2) 代码(2)把START的地址放入文字池,汇编器在地址0x8024处置配了1字的内存,寄存0x8000,发生句子
LDR R0,[0x8024]
(3) 代码(3)把ARNEW的地址放入文字池,汇编器在地址0x8028处置配了1字的内存,寄存0x8010,发生句子
LDR R0,[0x8028]
(4) 代码(4)把ARNEW+100的地址放入文字池,汇编器在地址0x802C处置配了1字的内存,寄存0x8074,发生句子
LDR R0,[0x802C]


[B1]使用小结:
1. 数据在ARM指令答应的规模内,用MOV RX,#X
2. 数据超出规模,用LDR RX,=X。此刻的LDR是一个伪指令。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/262739.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部