微处理器对取自接连的存储器地址单元的指令默许的履行次序操作是选用直线式的,即次序履行指令,但在实践使用中,往往需求改动这一履行序列,搬运到存储器的某个部分去履行那里的指令,操控搬运指令可以将这个履行序列搬运到存储器其他部分。
知识点:
搬运和搬运链接指令B和BL
B
{cond} label
BL {cond} label
(1)
无条件搬运
(2)
条件搬运
搬运交流指令BX
试验:
ARM与Thumb状况切换
比如
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版别以及今后的体系结构支撑Thumb,这儿的比如程序时在ARM7TDMI核的处理器下运转的。
2.
代码(1)伪指令ADR将寄存器相关表达式或程序相关表达式的地址存入寄存器中。这儿是将地址TSTART+1存入R0中,这样就加载了搬运地址而且设置了最低有用位。
3.
代码(2)这是R0中数值的第0位是1,所以该句子履行后处理器切换进入Thumb状况,开端履行Thumb指令,这时应看到状况寄存器的T位被置1。
4.
代码(3)汇编器需求知道什么时候发生ARM代码,什么时候发生Thumb代码。伪指令。。。。。。。。。。。。。。
|
|
AREA Example2,CODE |
|
|
|
|
ENTRY |
|
|
START |
8000 |
ADR R0,TSTART+1 |
R0=0x00008009; PC=0x00008004 |
add r0,pc,#1 ; #0x8009 |
|
8004 |
BX R0 |
PC=0x00008008;CPSR_T |
bx r0 |
|
|
CODE16(thumb) |
|
|
TSTART |
8008 |
MOV R0,#10 |
R0=0x0000000A;PC=0000800A |
mov r0,#0xa |
|
800a |
MOV R1,#5 |
R1=0x00000005;PC=0000800C |
mov r1,#5 |
|
800c |
BL DOADD |
LR(R14)=0x00008011;PC=0x00008016 |
bl DOADD |
STOP |
8010 |
MOV R0,#0x18 |
R0=0x 00000018;PC= 0x00008012 |
mov r0,#0x18 |
|
8012 |
LDR R1,=0x20026 |
R1= 0x00020026;PC= 0x00008014 |
ldr r1,0x0000801c ; = #0x00020026 |
|
8014 |
SWI 0xAB |
|
swi 0xab |
DOADD |
|
ADD R0,R0,R1 |
R0= 0x0000000F;PC= 0x00008018 |
add r0,r0,r1 |
|
8018 |
MOV PC,LR |
PC= 0x00008010 |
mov pc,r14 |
|
|
END |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
试验一
程序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. 阅读程序,画出流程图,并简略描绘程序完结的功用。
2. 在ARMLinker中设置R0Base=0x00008000,完结下表。
3. ARM指令和Thumb指令在存储方面的差异是什么?
序号 |
履行指令 |
指令履行后的改变状况 |
寄存器 |
R0 |
R1 |
R2 |
R15 |
CPSR |
0 |
|
0x0 |
0x0 |
0x0 |
0x8000 |
|
1 |
|
|
|
|
|
|
2 |
|
|
|
|
|
|
3 |
|
|
|
|
|
|
4 |
|
|
|
|
|
|
5 |
|
|
|
|
|
|
6 |
|
|
|
|
|
|
7 |
|
|
|
|
|
|
8 |
|
|
|
|
|
|
9 |
|
|
|
|
|
|
10 |
|
|
|
|
|
|
答案:
1. 程序的功用是使用搬运交流指令完结ARM和Thumb状况切换。
2. 代码(1)再次用ADR取得地址,但这一次铲除了最低的有用位。由此可知,在履行转化交流之后,处理器会切换进入ARM状况,开端履行ARM指令。这时应看到状况寄存器的T位被铲除。
3. 代码(2)由于现在又回到ARM状况下,所以调用软中止用一下句子:
SWI 0x123456
试验二
程序Ex_of1.s
AREA Ex_of1,CODE
ENTRY
START
ADR R0,TSTART+1
BX R0
CODE16
TSTART
MOV R0,#10
MOV R1,#5
ADD R0,R0,R1
STOP
MOV R0,#0x18
LDR R1,=0x20026
SWI 0xAB
END
程序Ex_of2.s
AREA Ex_of2,CODE
ENTRY
START
ADR R0,ASTART
BX R0
;CODE16
ASTART
MOV R0,#10
MOV R1,#5
ADD R0,R0,R1
STOP
MOV R0,#0x18
LDR R1,=0x20026
SWI 0x123456
END
阅读程序Ex_of1.s和Ex_of2.s,依据下列两个程序答复问题:
4. 先不履行程序,剖析程序Ex_of1.s和Ex_of2.s的巨细各为多少字节,为什么会有这样的差异?
5. ARM和Thumb间的状况切换对寄存器的内容有无影响?
6. 履行程序,验证你的答复。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/262738.html