抱歉这个可能很愚蠢的问题,但我不明白这是如何工作的。假设我们有一个 x86 处理器并且我们跳转到某个地址。据我所知,这条指令在内存中占用 5 个字节。jmp(1 个字节)+ 地址(4 个字节)。但是我不明白处理器是如何读取这条指令的,因为 x86 的寄存器大小是 4 个字节,而我们的指令大小是 5 个字节。事实证明,处理器需要 2 个周期来读取这条指令,因为它不完全适合寄存器。我知道这很可能不是这种情况,但我不明白它是如何工作的。你能告诉我什么是什么。提前致谢 :)
抱歉这个可能很愚蠢的问题,但我不明白这是如何工作的。假设我们有一个 x86 处理器并且我们跳转到某个地址。据我所知,这条指令在内存中占用 5 个字节。jmp(1 个字节)+ 地址(4 个字节)。但是我不明白处理器是如何读取这条指令的,因为 x86 的寄存器大小是 4 个字节,而我们的指令大小是 5 个字节。事实证明,处理器需要 2 个周期来读取这条指令,因为它不完全适合寄存器。我知道这很可能不是这种情况,但我不明白它是如何工作的。你能告诉我什么是什么。提前致谢 :)
Skylake 处理器的输入宽度为每个周期 16 字节,也就是说,处理器在一个周期内可以读取三个这样的命令。
只有在命令本身直接指定时,命令“内部”直接包含的数据才会进入寄存器,而“命令”部分将在硬件级别被丢弃。
当程序启动时,处理器将代码入口点的地址传送给MMU内存控制器,之后控制器已经开始从RAM中读取。DDR 内存总线的大小为 64 位(8 字节),控制器以突发模式“Burst-Length”一次读取 64 字节数据,即 将指针指向内存块的开头一次,并重复读取操作 8 次(8x8=64)。这 64 个字节直接进入 L3 高速缓存的一行(高速缓存行),并且在每个周期中,它们进一步移动到处理器的执行核心。
在执行内核中,对指令进行分析(拆分为 Mops 微指令),只有当该指令暗示某种计算时,才会进入处理器寄存器,否则由内核自己执行。在JMP指令的情况下,它的操作码被内核吸收,4字节的地址被写入EIP(指令指针)寄存器。这会导致处理器跳转到 JMP 中指定的地址。