ARM汇编实现C语言switch语句其中对PC寄存器取值的解析
2016-12-12 19:28
766 查看
源码如下:
AREA EX4_44,CODE,READONLY ENTRY CODE32 START MOV R0,#0 CMP R0,#8 ADDLT PC,PC,R0,LSL#2 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_7 MOV R0,#8 B end0 method_d MOV R0,#0 end0 B START END
反汇编见下图:
以上代码执行结果为:
程序会跳转到method_0分支,会执行MOV R0,#1这条指令,然后跳转到end0分支,一个循环结束。
分析:
指令ADDLT PC,PC,R0,LSL#2的地址为0x32000008,R0=0; PC=PC+(4*R0); 当程序执行到ADDLT PC,PC,R0,LSL#2的时候,PC会指向下一条指令的地址即PC=0x3200000c,那么经过PC=PC+(4*R0);计算PC仍然等于0x3200000c啊,0x3200000c这个地址对应的程序代码明明是B method_d啊,为什么没有执行这一句代码呢。我们反着来推一下,程序跳转到method_0这个分支,说明在0x32000008这个地址位置的代码ADDLT
PC,PC,R0,LSL#2执行完之后,PC是等于0x32000010的。为什么会这样呢?这里就要考虑ARM处理器的多级流水线技术,ARM7为3级流水,ARM9为5级流水。
见下图:
这个图可以很直观的感受一下多级流水的过程:PC寄存器的值是在每次取指令之后自动修改指向下一条指令,如此看来,当指令1执行的时候,指令2已经完成取指开始译码,此时PC指向指令2的下一条指令,就是指令3,此时PC=0x32000010,所以是PC=0x32000010的时候参与指令1的执行过程也就是计算过程。
相关文章推荐
- C语言switch语句的汇编语言实现
- C语言switch语句的汇编语言实现
- ARM汇编程序---C语言调用ARM汇编实现字符串的拷贝
- C语言中switch case语句的实现
- C语言利用switch语句实现输入一个字母,输出它前后紧挨着的字母
- ARM汇编程序---C语言调用ARM汇编实现字符串的拷贝
- C语言中switch case语句的实现
- C语言中switch case语句可变参实现方法(case 参数 空格...空格 参数 :)
- 解析c语言switch中break语句的具体作用
- 第1周 C语言及程序设计初步 例程-2 用switch语句实现多分支结构
- C语言及程序设计初步例程-25 用switch语句实现多分支结构
- C语言中switch case语句的实现(switch case 和 else if 的比较、区别)
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- 快速识别汇编中等价的C语言语句(if, while, for, switch)
- C语言:switch语句实现多分支语句
- ARM汇编学习之寄存器 之PC
- C语言中switch case语句可变参实现方法(case 参数 空格...空格 参数 :)
- 《C语言及程序设计》程序阅读——用switch语句实现多分支结构
- 计算数组的和: C=(3A+4B)/8和C语言实现的FIR算法,改成ARM汇编程序