Kernel 为什么在ARM指令集的情况下,PC设置为当前#u地址+;8.

Kernel 为什么在ARM指令集的情况下,PC设置为当前#u地址+;8.,kernel,arm,Kernel,Arm,我知道,ARM使用三级管道。因此,一条指令分为3部分:获取、解码和执行 我的第一个疑问是,这是否意味着指令被转换为3条指令?那么,它在加载时是否会有3个地址 第二个疑问是,为什么我们将PC设置为当前地址+8?您描述的是早期的ARM体系结构,ARM核心从一开始就至少有三个阶段在进行中。较新的ARM体系结构在其管道中有更多的阶段,但是由于向后兼容性的问题,PC在执行指令时仍然需要+8地址 例如,手册上说有9个阶段,有5个阶段,等等 核心管道阶段如下;获取、解码和执行。Fetch从内存中加载指令,因此

我知道,ARM使用三级管道。因此,一条指令分为3部分:获取、解码和执行

我的第一个疑问是,这是否意味着指令被转换为3条指令?那么,它在加载时是否会有3个地址


第二个疑问是,为什么我们将PC设置为当前地址+8?

您描述的是早期的ARM体系结构,ARM核心从一开始就至少有三个阶段在进行中。较新的ARM体系结构在其管道中有更多的阶段,但是由于向后兼容性的问题,PC在执行指令时仍然需要+8地址

例如,手册上说有9个阶段,有5个阶段,等等


核心管道阶段如下;获取、解码和执行。Fetch从内存中加载指令,因此,如果您认为当前执行的指令是n,则解码阶段是n+4,下一次Fetch是n+8。它是4的倍数,因为ARM模式中的指令是4字节。(如果您处于thumb/thumb2模式,它可能是+4)

您正在描述早期的ARM体系结构,其中ARM核心从一开始就至少有三个阶段在管道中。较新的ARM体系结构在其管道中有更多的阶段,但是由于向后兼容性的问题,PC在执行指令时仍然需要+8地址

例如,手册上说有9个阶段,有5个阶段,等等


核心管道阶段如下;获取、解码和执行。Fetch从内存中加载指令,因此,如果您认为当前执行的指令是n,则解码阶段是n+4,下一次Fetch是n+8。它是4的倍数,因为ARM模式中的指令是4字节。(如果您处于thumb/thumb2模式,可能是+4)

请理解前面有两条指令。对于意味着arm模式超前8字节的32位架构,需要两条指令。但在thumb模式下,它可以是4到8个字节,重要的是它有两条指令…

请理解前面有两条指令。对于意味着arm模式超前8字节的32位架构,需要两条指令。但在thumb模式下,它可以在4到8字节之间,重要的是它有两条指令…

FWIW,在AArch64中,这不再适用。所有PC相对偏移量都是从指令地址计算出来的,PC不能作为GPR.FWIW访问,在AArch64中,这不再适用。所有PC的相对偏移量都是从指令地址计算出来的,PC不能作为GPR访问。