我了解到,ARM使用3级流水线。所以一条指令被分为三部分取指令,解码指令和执行指令。为什么在ARM指令集的情况下,PC被设置为current_address + 8?
我的第一个疑问是,这是否意味着指令被转换为3条指令?所以它会加载3地址?
第二个疑问是,为什么我们将PC设置为current_address + 8?
我了解到,ARM使用3级流水线。所以一条指令被分为三部分取指令,解码指令和执行指令。为什么在ARM指令集的情况下,PC被设置为current_address + 8?
我的第一个疑问是,这是否意味着指令被转换为3条指令?所以它会加载3地址?
第二个疑问是,为什么我们将PC设置为current_address + 8?
您正在描述早期的ARM体系结构,其中ARM内核从一开始就至少有三个流水阶段。较新的ARM架构在其流水线中有更多的阶段,但是作为向后兼容性怪癖PC在执行指令时仍然是+8地址。
例如手册说ARM1156T2-S有9级,ARM946E-S具有5等
核心流水线级变为等;取,解码和执行。取指从内存中加载指令,所以如果你认为你现在正在执行n指令,那么译码阶段是n + 4,下一个读取是在n + 8。它与4的乘法一致,因为ARM中的指令在ARM模式下是4个字节。 (如果你在拇指/拇指2模式下,它可能是+4)
了解这是两条指令。对于32位架构,这意味着手臂模式提前8个字节,两条指令。但在拇指模式下,它可以在4到8个字节之间,重要的是两条指令...
FWIW,在AArch64中不再适用。所有与PC相关的偏移量都是从指令的地址计算出来的,PC不能作为GPR访问。 –