x86 处理器将 IP 寄存器递增多少?

How much does a x86 processor increment the IP register?

所有 x86 cpu 都有指令指针寄存器,它保存要获取执行的下一条指令的偏移量(地址)。如果没有分支或跳转,为获取下一条指令而增加(或减少)的典型数量是多少?我认为这可能是一条典型指令的大小,也许是 32 位?

它不能简单地增加 "typical" 指令的大小,因为在 x86 架构中没有 "typically-sized" 指令这样的东西。 Instructions have all kinds of weird, varying sizes,以及各种可选前缀的可能性。 (虽然有一个上限:指令最多只能包含 15 个字节。)

尽管许多流行的 RISC 处理器使用固定宽度的指令编码(Alpha、MIPS 和 PowerPC 都有固定大小的 32 位指令,而 Itanium 有固定大小的 41 位指令),Intel x86 使用可变宽度编码,主要是出于历史原因。这是一个非常复杂的ISA!


(图片来自 Igor Kholodov 的讲义:http://www.c-jump.com/CIS77/CPU/x86/lecture.html

因此,处理器必须具有更新指令指针 (IP) 的内部逻辑,作为其指令解码过程的一部分。它获取指令,对其进行解码,然后将指令指针递增 解码指令的实际大小。 (也就是说,从程序员的高层角度来看。在内部,事情更加复杂,这要归功于推测执行。)

由于指令解码非常复杂,因此必须投入大量硅来完成这项工作。在低功耗 Atom 处理器上,大约 20% 的总功耗来自解码指令。但是,这种复杂性至少有一个好处:增加指令 密度 。可变长度指令编码意味着某些常用指令可以仅使用几个字节进行编码,因此在指令缓存中占用的空间很小space。所以你有一个经典的工程权衡,其中指令解码器更大更复杂,指令缓存可以做得更小,因此更便宜。

请注意,在正常 "straight-line" 解码中,指令指针永远不会递减。与堆栈不同,指令流在内存中向上增长。递减只会由于分支而发生,您的问题明确禁止。但我会打破规则并指出,当执行分支时(例如,通过无条件jmp、条件跳转或call ), 指令指针被显式更改以匹配分支的目标。