请教cortex-m3处理器读PC返回当前指令地址+4的原因

2019-12-27 19:02发布

额,小弟一直对cortex-m3/m4内核部分不甚理解,特意看了下权威指南.以下是书中原话:

R15为程序计数器PC,是可读可写的,读操作返回当前指令地址+4(由于三级流水线特性及同ARM7TDMI处理器兼容的需要).

额,小弟思考了下三级流水线,以下是小弟的理解,暂且不知道是否正确...

1>取指------译码------执行

2>cortex-m3每次取指都是32位的,也就是4个字节

3>所以如果以当前执行的指令为基准,取指指令应该是当前PC+8字节才对啊,为什么是PC+4???

上面3个步骤是我哪里理解出错了???还是因为其它什么原因???

恳请大神不惜赐教...谢谢...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
redroof
1楼-- · 2019-12-28 18:42
擦鞋匠 发表于 2017-5-23 15:36
我这里只是针对cortex-m3/m4处理器...其它处理器我没了解过

因为不管是I-CODE还是D-CODE都是32位的宽度, ...

整个内存和数据通道都是32位没错,但是指令的长度单位是16位。
也就是说下一条指令存放在这一条指令后面2字节处。
PC只管记录下一条指令的地址,并不管内存和总线的位宽。
WM_CH
2楼-- · 2019-12-27 21:01
 精彩回答 2  元偷偷看……
redroof
3楼-- · 2019-12-27 22:11
其实一个“兼容”就够解释一切了
以后的M7,A8,A9等等这些高端处理器,根本就不是3级流水线,而是更多级的流水线,所以按照最自然的设计,读PC读到的完全不该是当前指令+4!
但是,他们必须用更复杂的各种设计,多费很多事,来保证你想读PC的时候要读到当前指令+4。以此保证对从ARM7开始的这些前辈的精确兼容。

redroof
4楼-- · 2019-12-28 02:54
早期的一个看似合理的选择,也就是以后你必须遵守的规矩,即使以后你认为这样很不合理也没办法了。
因为自己不能打自己的嘴巴~
擦鞋匠
5楼-- · 2019-12-28 07:34
本帖最后由 擦鞋匠 于 2017-5-23 15:06 编辑
redroof 发表于 2017-5-23 14:56
早期的一个看似合理的选择,也就是以后你必须遵守的规矩,即使以后你认为这样很不合理也没办法了。
因为自 ...


所以我似乎感觉2楼神似乎说的不完全正确...
如果只是考虑三级流水线的话...
不管当前指令还没/正在/刚刚执行结束,还没进行下次取指,在取指操作和执行操作之间总是相差2个步骤(两者之间总是对称的)...所以应该是8
redroof
6楼-- · 2019-12-28 09:46
擦鞋匠 发表于 2017-5-23 15:05
所以我似乎感觉2楼神似乎说的不完全正确...
如果只是考虑三级流水线的话...
不管当前指令还没/正在/刚刚 ...

其实你自己说的就是对的。
就是隔2个指令,不是隔1个指令。
只是你忘了Thumb状态下的一个指令是16位,也就是2字节
ARM7在Thumb状态下读PC返回当前地址+4,而ARM状态下返回当前地址+8
M3和M4只有Thumb状态。

从ARM9的5级流水线开始,就得专门想办法对付这个“读PC返回两条指令之前”的特性了。以后的流水线更长的型号更得费事来仿真这个特性。
只有对3级流水线来说,这是最自然的动作~

一周热门 更多>