问一个16位指令集PC递增的问题
时间:12-12
整理:3721RD
点击:
指令集是16位的Thumb
但是总线是32位的,一次可以读出32位的数据
问题:
1.PC指针在递增的时候,是递增4还是递增2?
2.如果递增4,那么一口气读出32位数据(两条指令),那势必会分两次执行。结果就变成了:
READ-EXCUTE0-EXCUTE1-READ_EXCUTE0-EXCUTE1-......
是这样的么?
3.如果是递增2,一次只读一条指令,那么看起来要好一点,流水会很舒服
那么哪种做法是正确的?或者更好?
具体,CPU是CortexM0
谢谢
但是总线是32位的,一次可以读出32位的数据
问题:
1.PC指针在递增的时候,是递增4还是递增2?
2.如果递增4,那么一口气读出32位数据(两条指令),那势必会分两次执行。结果就变成了:
READ-EXCUTE0-EXCUTE1-READ_EXCUTE0-EXCUTE1-......
是这样的么?
3.如果是递增2,一次只读一条指令,那么看起来要好一点,流水会很舒服
那么哪种做法是正确的?或者更好?
具体,CPU是CortexM0
谢谢
我仿真的结果来看
地址是递增的4
所以我觉得很奇怪,很别扭
有点糊涂了
和ISA什么关系
PC的递增不是反映在MCU的地址上面的么?只要看MCU输出的地址,不就是知道当前读到IRAM的哪个地址了么?同时也就知道当前执行的指令是什么了么?
从仿真来看,我读到的指令是对的。但是某一拍起,htrans就红了,具体我还没有trace过去。
我怀疑是GPR没有初始化导致的。
I donnot know
just guess
如果我做,我选递增4,避免总线对齐;
后面大萝卜说的对,ISA和实现是两码事:ISA是程序员看起来怎么执行指令,硬件实现是硬件实现。
硬件每次读2条指令,也可以让程序员看起来每次读了1条;
流水线的问题,还有个指令cache的事情,memory很慢
一次fetch 32b,可以芯片内部需要两拍执行,所以pc应该是+2的。
如果是1拍执行,则pc+4,不过硬件上就的要dual-decoder了。
x86是变长指令集,可是大部分时候在外部总线上看,每次都读512b的数据
pipeline前端一次读16byte的指令块,同时预取下一个相邻cache line, 你说的是读取一条cache line的情况,64bytes x 8=512bit.
我只是想说明总线宽度和architecture中pc的移动没有必然联系。
是,因为下一次取的指令块由上一次取到的指令块还有branch predication 共同决定的。
程序员可以指定下一次运行的地址,之后对我们有意义的就只有cpu最后一条执行过的指令了,主要OS在乎,用它来重新调度。
首先cortex-m是thumb-2指令集,16与32比特混合指令