学ARM汇编有二十来天了,按照课本顺序看过了基础知识、ARM处理器基础、ARM指令系统。正在看ARM汇编语言程序设计的分支程序设计。昨晚看switch结构实现有个想法,不知道对不对在这里写出来请大家指点。
程序实现switch功能代码如下
AREA EX4_44,CODE,READONLY
ENTRY
CODE32
START CMP R0,#8 ;与8比较大小 实现8分支的
;状态标志位更改
ADDLT PC,PC,R0,LSL #2 ;根据R0选择分支
B METHOD_D
B METHOD_0
B METHOD_1
B METHOD_2
B METHOD_3
B METHOD_4
B METHOD_5
B METHOD_6
B METHOD_7
METHOD_0
MOV R0,#1
B END0
METHOD_1
MOV R0,#2
B END0
METHOD_2
MOV R0,#3
B END0
METHOD_3
MOV R0,#4
B END0
METHOD_4
MOV R0,#5
B END0
METHOD_5
MOV R0,#6
B END0
METHOD_6
MOV R0,#7
B END0
METHOD_D
MOV R0,#0
END0 B START
END
软件仿真ARM920T
在仿真过程中分支指令ADDLT PC,PC,R0,LSL #2地址0x8004 假设R0=2其结果为0x8014
这样的结果与我预想的不同0x800C不同
分析原因
因PC=PC+(R0*4)
故预想结果出错必然是PC的值预想带入0x8004不对
1.想到PC在执行时指向下一条指令故该带入0x8008但结果依旧是不正确的
2.既然是PC不对那么分析PC的变化,对此想到PC不是在一条指令执行后变换。因为ARM采用流水线 故应该是在取指令后PC变化。因为ARM920T采用三级流水线分析其执行过程有如下收获。
执行0x8004处分支指令过程中在真正执行前已经两次修改了PC,此时PC为0x800C。
原因是在0x8004取指令后开始分析前,因流水线执行PC已经修改成0x8008准备取指令。在0x8004指令分析后,0x8008指令完成取指令准备分析,此时又修改了PC为0x800C准备取指令。此时0x8004才真正执行即使用的PC值为0x800C。