所有x86 cpu都有指令指针寄存器,用于保存要读取的下一条指令的偏移量(地址)。如果没有分支或跳转,那么下一条获取指令的递增(或递减)的典型量是多少?我认为这可能是32位典型指令的大小?
答案 0 :(得分:7)
它不能简单地通过"典型"的大小来增加它。指导,因为没有"通常大小的" x86架构中的指令。 Instructions have all kinds of weird, varying sizes,以及各种可选前缀的可能性。 (虽然有一个上限:指令最多只能包含 15个字节。)
虽然许多流行的RISC处理器对指令使用固定宽度编码(Alpha,MIPS和PowerPC都有固定大小的32位指令,而Itanium有固定大小的41位指令),但Intel x86使用变量-width编码,主要是出于历史原因。这是一个非常复杂的ISA!
(图片取自Igor Kholodov'讲义:http://www.c-jump.com/CIS77/CPU/x86/lecture.html)
因此,处理器必须具有内部逻辑,该内部逻辑在指令解码过程中更新指令指针(IP)。它获取指令,对其进行解码,并通过解码指令的实际大小递增指令指针。 (也就是说,从程序员的高级角度来看。由于投机性的执行,内部事情变得更加复杂。)
由于指令解码非常复杂,因此必须投入大量的硅来实现这一目标。在低功耗Atom处理器上,大约20%的总功耗来自解码指令。但是,这种复杂性至少有一个好处:增加指令密度。可变长度指令编码意味着某些常用指令只能使用几个字节进行编码,因此在指令高速缓存中占用的空间非常小。因此,您需要经典的工程权衡,而指令解码器更大更复杂,指令缓存可以做得更小,因此更便宜。
请注意,指令指针永远不会在正常情况下递减,"直线"解码。与堆栈不同,指令流在内存中向上增长。只有分支才能实现减量,而您的问题明确禁止分支。但我打破规则并指出,当执行分支时(例如,通过无条件jmp
,条件跳转或call
) ,指令指针被显式改变以匹配分支的目标。