微处理器对取自连续的存储器地址单元的指令默认的执行顺序操作是采用直线式的,即顺序执行指令,但在实际应用中,往往需要改变这一执行序列,转移到存储器的某个部分去执行那里的指令,
控制转移指令能够将这个执行序列转移到存储器别的部分。
知识点:
转移和转移链接指令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.
执行程序,验证你的回答。