<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM數據加載與存儲指令 (二)

ARM數據加載與存儲指令 (二)

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
接上ARM數據加載存儲指令 (一)
完成下列任務(wù)
1.閱讀程序exp6_2.s,寫(xiě)出程序的功能。設置代碼段的基地址為0x8000。用AXD單步調試程序,觀(guān)察每執行一步以后,相應的寄存器和存儲器的變化情況,完成表格。
打開(kāi)的process view窗口如下:register,disassembly,low lever symbols,memory
序號執行指令指令執行后變化情況
寄存器存儲器
R0R1R2R3R4SPPC0x80240x80280x802C0x80300x8038
00x00x00x00x00x00x00x80000x200x620x690x670x21
1
2
3
4
5
6
7
8
9
10

答案:
1.程序的功能是計算給定數據各項和的平均值,方法是先將數據各項加載到寄存器中,然后利用數據處理指令計算,最后再講結果存入寄存器中。

一、 綜合編程
1.繪圖分析多寄存器傳送指令的各種模式,并設計程序驗證。(學(xué)生作業(yè))
IA:
數據起始地址:0x800C
0x800C 0x10
0x80100x20
0x80140x30
R0R1
0x100x20

DB:
數據起始地址:0x8010
0x80100x10
0x80140x20
0x80180x30
R0R1
0x100x20

FD:
數據起始地址:0x800C
0x800C 0x10
0x80100x20
0x80140x30
R0R1
0x100x20

EA:
數據起始地址:0x8010
0x8010 0x10
0x80140x20
0x80180x30
R0R1
0x100x20

二、 注意事項 (程序中加載常量和地址的方法)
實(shí)際編程的過(guò)程中,常需要把立即數常量和地址值載入寄存器,由于指令集長(cháng)度的限制和存儲/加載體系結構的特點(diǎn),這兩個(gè)問(wèn)題需要專(zhuān)門(mén)說(shuō)明。

區別:
START LDR R0,START 把START相對應的地址值的存儲單元里的數據加載到R0,這條指令的結構就是R0里存儲的是指令LDR R0,START對應的二進(jìn)制代碼。
LDR R0,=SRART 把START相對應的地址值加載到R0
ADR R0,START 把START相對應的地址值加載到R0


1. 加載常量到寄存器
(1) 使用MOV或MVN指令直接加載
直接加載任何取值在0x0~0xFF間的8位常量。
對上述的取值進(jìn)行循環(huán)右移偶數次后的數值n
例子: MOV R1,#0x250

(2) 使用一種偽指令格式加載
使用一個(gè)LDR指令和在數字量前的等號,就可以很容易地將常量寫(xiě)入代碼。
例子:LDR R1,=0x520
如果構造的常量能用MOV或者M(jìn)VN指令加載,那么匯編器會(huì )采用適當的指令;否則,匯編器會(huì )產(chǎn)生一個(gè)帶PC相對偏移地址的LDR指令來(lái)從文字池中讀取常量。
文字池是為常量留出的一部分內存。
默認情況:在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循環(huán)右移28位后的值,同樣可以采用MOV指令直接加載。
(3) 常量0xFF0取值在MOV或MVN指令所能加載的取值范圍之內,在A(yíng)XD中通過(guò)反匯編可以看到匯編器產(chǎn)生了以下代碼 MOV R2,#0xFF0
(4) 常量0x5C34D77D超出了取值范圍,所以匯編器用DCD分配了一個(gè)字的內存來(lái)存放常量。這段內存就是一個(gè)文字池,其地址是0x8020。在A(yíng)DX中通過(guò)反匯編可以看到匯編產(chǎn)生的一下代碼印證了這一點(diǎn)。
LDR R3, #0x00008020 ;=#0x5C34D77D
...
0x8020 DCD 0x5C34D77D

2. 加載地址到寄存器
程序中常常要加載某個(gè)地址到寄存器中,偽指令ADR和ADRL的功能就是將一個(gè)寄存器相關(guān)表達式或程序相關(guān)表達式的地址存入寄存器中。
(1)用ADR或ADRL直接加載
所謂程序相關(guān)表達式就是標號相對于當前PC的偏移地址,而寄存器相關(guān)表達式就是標號相對于保存在指定的通用寄存器中的地址。一般的格式是:
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)在A(yíng)XD中通過(guò)反匯編可以看到匯編器產(chǎn)生以下代碼
SUB R0,PC,#8 ;#0x8000
(2) 代碼(2)在A(yíng)XD中通過(guò)反匯編可以看到匯編器產(chǎn)生了一下代碼
ADD R1,PC,#0x10 ;#0x801C
(3) 代碼(3)在A(yíng)XD中通過(guò)反匯編可以看到匯編器產(chǎn)生了一下代碼
ADD R1,PC,#0x300 ;#0x8310
ADD R2,R2,#0xF4
由于標簽ADDR的地址是0x801C,所以以上匯編器產(chǎn)生的指令將地址正確地加載到了寄存器中。

(2)使用一種偽指令格式加載(LDR)
注意:這里的LDR是偽指令,與加載指令不同。
LDR Rd,=label
與前述利用LDR指令加載常量到寄存器相似,這種格式也可以加載程序相關(guān)表達式到寄存器。實(shí)際上,匯編器會(huì )把label的地址放入文字池,并產(chǎn)生一個(gè)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都放入了文字池,這樣文字池就變成了
地址數據
0x80200x20026
0x80240x8000
0x80280x8010
0x802C0x8074
即在文字池的偏移地址為4處存放著(zhù)START地址,偏移地址為8處存放著(zhù)ARNEW地址,偏移地址為12(0xC)處存放著(zhù)ANREW+100地址。
(2) 代碼(2)把START的地址放入文字池,匯編器在地址0x8024處分配了1字的內存,存放0x8000,產(chǎn)生語(yǔ)句
LDR R0,[0x8024]
(3) 代碼(3)把ARNEW的地址放入文字池,匯編器在地址0x8028處分配了1字的內存,存放0x8010,產(chǎn)生語(yǔ)句
LDR R0,[0x8028]
(4) 代碼(4)把ARNEW+100的地址放入文字池,匯編器在地址0x802C處分配了1字的內存,存放0x8074,產(chǎn)生語(yǔ)句
LDR R0,[0x802C]

[B1]應用小結:
1. 數據在A(yíng)RM指令允許的范圍內,用MOV RX,#X
2. 數據超出范圍,用LDR RX,=X。此時(shí)的LDR是一個(gè)偽指令。



關(guān)鍵詞: ARM數據加載存儲指

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>