ARM控制轉(zhuǎn)移指令
知識點:
轉(zhuǎn)移和轉(zhuǎn)移鏈接指令B和BL
B {cond} label
BL {cond} label
(1) 無條件轉(zhuǎn)移
(2) 條件轉(zhuǎn)移
轉(zhuǎn)移交換指令BX
實驗:ARM與Thumb狀態(tài)切換
例子
AREA Example2,CODE
ENTRY
START
ADR R0,TSTART+1 ;(1)
BX R0 ;(2)
CODE16 ;(3)
TSTART
MOV R0,#10
MOV R1,#5
BL DOADD ;(4)
STOP
MOV R0,#0x18
LDR R1,=0x20026
SWI 0xAB ;(5)
DOADD
ADD R0,R0,R1
MOV PC,LR
END
程序解讀:
1. 不是所有的ARM處理器都支持Thumb指令,只有ARMv4T版本以及以后的體系結(jié)構(gòu)支持Thumb,這里的例子程序時在ARM7TDMI核的處理器下運行的。
2. 代碼(1)偽指令A(yù)DR將寄存器相關(guān)表達式或程序相關(guān)表達式的地址存入寄存器中。這里是將地址TSTART+1存入R0中,這樣就加載了轉(zhuǎn)移地址并且設(shè)置了最低有效位。
3. 代碼(2)這是R0中數(shù)值的第0位是1,所以該語句執(zhí)行后處理器切換進入Thumb狀態(tài),開始執(zhí)行Thumb指令,這時應(yīng)看到狀態(tài)寄存器的T位被置1。
4. 代碼(3)匯編器需要知道什么時候產(chǎn)生ARM代碼,什么時候產(chǎn)生Thumb代碼。偽指令。。。。。。。。。。。。。。
實驗一
程序7_1.s
AREA Lab1,CODE
ENTRY
START
ADR R0,TSTART+1
BX R0
CODE16
TSTART
MOV R0,#10
MOV R1,#5
ADD R0,R0,R1
ADR R0,ASTART ;(1)
BX R0
CODE32
ASTART
MOV R0,#0x12
MOV R1,#0x34
ADD R0,R0,R1
STOP
MOV R0,#0x18
LDR R1,=0x20026
SWI 0x123456 ;(2)
END
1. 閱讀程序,畫出流程圖,并簡單描述程序?qū)崿F(xiàn)的功能。
2. 在ARMLinker中設(shè)置R0Base=0x00008000,完成下表。
3. ARM指令和Thumb指令在存儲方面的差異是什么?
答案:
1. 程序的功能是利用轉(zhuǎn)移交換指令完成ARM和Thumb狀態(tài)切換。
2. 代碼(1)再次用ADR獲得地址,但這一次清除了最低的有效位。由此可知,在執(zhí)行轉(zhuǎn)換交換之后,處理器會切換進入ARM狀態(tài),開始執(zhí)行ARM指令。這時應(yīng)看到狀態(tài)寄存器的T位被清除。
3. 代碼(2)因為現(xiàn)在又回到ARM狀態(tài)下,所以調(diào)用軟中斷用一下語句:
SWI 0x123456
實驗二
轉(zhuǎn)移和轉(zhuǎn)移鏈接指令B和BL
B
BL {cond} label
(1)
(2)
轉(zhuǎn)移交換指令BX
實驗:ARM與Thumb狀態(tài)切換
例子
START
TSTART
STOP
DOADD
程序解讀:
1.
2.
3.
4.
AREA Example2,CODE | ||||
ENTRY | ||||
START | 8000 | ADR R0,TSTART+1 | R0=0x00008009; PC=0x00008004 | add |
8004 | BX R0 | PC=0x00008008;CPSR_T | bx | |
CODE16(thumb) | ||||
TSTART | 8008 | MOV R0,#10 | R0=0x0000000A;PC=0000800A | mov |
800a | MOV R1,#5 | R1=0x00000005;PC=0000800C | mov | |
800c | BL DOADD | LR(R14)=0x00008011;PC=0x00008016 | bl | |
STOP | 8010 | MOV R0,#0x18 | R0=0x 00000018;PC= 0x00008012 | mov |
8012 | LDR R1,=0x20026 | R1= 0x00020026;PC= 0x00008014 | ldr | |
8014 | SWI 0xAB | swi | ||
DOADD | ADD R0,R0,R1 | R0= 0x0000000F;PC= 0x00008018 | add | |
8018 | MOV PC,LR | PC= 0x00008010 | ||
END | ||||
實驗一
程序7_1.s
START
TSTART
ASTART
STOP
1.
2.
3.
序號 | 執(zhí)行指令 | 指令執(zhí)行后的變化情況 | ||||
寄存器 | ||||||
R0 | R1 | R2 | R15 | CPSR | ||
0 | 0x0 | 0x0 | 0x0 | 0x8000 | ||
1 | ||||||
2 | ||||||
3 | ||||||
4 | ||||||
5 | ||||||
6 | ||||||
7 | ||||||
8 | ||||||
9 | ||||||
10 |
答案:
1.
2.
3.
SWI 0x123456
實驗二
程序Ex_of1.s
START
TSTART
STOP
程序Ex_of2.s
START
ASTART
STOP
閱讀程序Ex_of1.s和Ex_of2.s,根據(jù)下列兩個程序回答問題:
4.
5.
6.
評論