您的位置:首页 > 编程语言 > C语言/C++

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的执行过程也就是计算过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息