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

2019-04-15 13:11发布

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