數(shù)據(jù)加載與存儲指令時ARM在寄存器與存儲器之間實現(xiàn)數(shù)據(jù)傳送的一類指令。實驗目的:
l
單寄存器數(shù)據(jù)傳送指令的運用和各種變址尋址模式的掌握
l
多寄存器數(shù)據(jù)傳送指令的運用和各種變址尋址模式的掌握
l
單個數(shù)據(jù)復制和數(shù)據(jù)塊復制的方法。
l
利用調(diào)試器中各種窗口觀察完成各指令操作后寄存器、存儲器、標簽地址、機器指令等的變化情況。
一、 單寄存器的加載和存儲指令LDR|STR
AREA Lab1,CODE
ENTRY
START
ADR R1,SRC
ADR R2,DST
COPY
LDR R0,[R1]
STR R0,[R2]
ADD R1,R1,#0x4
ADD R2,R2,#0x4
LDR R0,[R1]
STR R0,[R2]
ADD R1,R1,#0x4
ADD R2,R2,#0x4
LDR R0,[R1]
STR R0,[R2]
STOP
B STOP
SRC
DCB "one small!"
ALIGN
DST
DCB "three big!"
END
程序說明:
1.
偽指令ADR是將一個寄存器相關變大時或程序相關表達式的地址存入寄存器中,在例子中相當于使R1指向SRC,R2指向DST地址,即初始化地址指針。
2.
DCB的作用是分配一組字節(jié)內(nèi)存并定義其內(nèi)容為指定字符串,也可以用“=”代替:
SRC = “one small!”
DST =“three big!”
完成下列任務
1.閱讀程序exp6_1.s,寫出程序的功能。設置代碼段的基地址為0x8000。用AXD單步調(diào)試程序,觀察每執(zhí)行一步以后,相應的寄存器和存儲器的變化情況,完成表格。
打開的process view窗口如下:register,disassembly,low lever symbols,memory
序號 | 執(zhí)行指令 | 指令執(zhí)行后變化情況 |
| | 寄存器 | 存儲器 |
| | R0 | R1 | R2 | PC | 0x8040 | 0x8041 | 0x8042 | 0x8043 | 0x8044 | 0x8045 | 0x8046 | 0x8047 | 0x8048 | 0x8049 |
0 | | 0x0 | 0x0 | 0x0 | 0x8000 | 0x74 t | 0x68 H | 0x72 r | 0x65 e | 0x65 e | 0x20 _ | 0x62 b | 0x69 i | 0x67 g | 0x21 ! |
1 | | | | | | | | | | | | | | | |
2 | | | | | | | | | | | | | | | |
3 | | | | | | | | | | | | | | | |
4 | | | | | | | | | | | | | | | |
5 | | | | | | | | | | | | | | | |
6 | | | | | | | | | | | | | | | |
7 | | | | | | | | | | | | | | | |
8 | | | | | | | | | | | | | | | |
9 | | | | | | | | | | | | | | | |
10 | | | | | | | | | | | | | | | |
2.程序中使用的尋址方式是間接尋址中的零變址方式,請將程序改為前變址形式和后變址形式。(繪圖分析各種變址尋址形式,并設計程序驗證。)
3.用多寄存器傳送指令修改程序。
答案:
1.
程序的功能是將存儲器中SRC處的源數(shù)據(jù)通過數(shù)據(jù)傳送指令傳送到DST處。
2.
前變址和后變址
方法一
COPY LDR R0,[R1],#4
STR R0,[R2],#4
LDR R0,[R1],#4
STR R0,[R2],#4
LDR R0,[R1],#4
STR R0,[R2],#4
方法二
SUB R1,R1,#4
SUB R2,R2,#4
MOV R3,#1
CPY
LDR R0,[R1,#4]!
STR R0,[R2,#4]!
CMP R3,#3
ADD R3,R3,#1
BNE CPY
方法三
LDR R0,[R1]
STR R0,[R2]
LDR R0,[R1,#4]
STR R0,[R2,#4]
LDR R0,[R1,#8]
STR R0,[R2,#8]
3. 多寄存器傳送指令
LDMIA R1!,{R3-R5}
STMIA R2!,{R3-R5}
一、 多寄存器的加載和存儲指令
AREA Lab2,CODE
ENTRY
START
LDR sp,=NUM
LDMFD SP!,{R0-R4}
ADD R4,R0,R1
ADD R4,R4,R2
ADD R4,R4,R3
MOV R4,R4,LSR #2
STR R4,[SP]
STOP
B STOP
AREA Dblock,DATA
NUM DCD 0x12,0x34,0x56,0x78
END
程序說明:
1. 定義一個名為Dblock的數(shù)據(jù)區(qū)域
2. 偽指令DCD的作用是分配一組字內(nèi)存并定義其內(nèi)容,分配的內(nèi)存一定是4的倍數(shù)。也可以用&替代。
NUM & 0x12, 0x34,0x56,0x78
評論