ARM汇编实现C语言switch语句其中对PC寄存器取值的解析

源码如下:
		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

反汇编见下图:

ARM汇编实现C语言switch语句其中对PC寄存器取值的解析_第1张图片

以上代码执行结果为:

程序会跳转到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级流水。

见下图:

ARM汇编实现C语言switch语句其中对PC寄存器取值的解析_第2张图片


这个图可以很直观的感受一下多级流水的过程:PC寄存器的值是在每次取指令之后自动修改指向下一条指令,如此看来,当指令1执行的时候,指令2已经完成取指开始译码,此时PC指向指令2的下一条指令,就是指令3,此时PC=0x32000010,所以是PC=0x32000010的时候参与指令1的执行过程也就是计算过程。


你可能感兴趣的:(ARM汇编)