ARM汇编语言 实现多分支switch结构的一点感想

 

学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。

 

 

 

你可能感兴趣的:(ARM嵌入式)