x86处理器增加多少IP寄存器?

x86处理器增加多少IP寄存器?,x86,cpu,opcode,X86,Cpu,Opcode,所有x86 cpu都有指令指针寄存器,它保存下一条要提取以执行的指令的偏移量(地址)。如果没有分支或跳转,下一条要获取的指令的典型增量(或减量)是多少?我认为它应该是一条典型指令的大小,可能是32位?它不能简单地按“典型”指令的大小递增,因为x86体系结构中没有“典型大小”指令,以及各种可选前缀的可能性。(尽管有上限:指令最多只能包含15个字节。) 尽管许多流行的RISC处理器对指令使用固定宽度编码(Alpha、MIPS和PowerPC都有固定大小的32位指令,而安腾有固定大小的41位指令),但

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

它不能简单地按“典型”指令的大小递增,因为x86体系结构中没有“典型大小”指令,以及各种可选前缀的可能性。(尽管有上限:指令最多只能包含15个字节。)

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


(图片取自伊戈尔·霍洛多夫的讲稿:)

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

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


请注意,在正常的“直线”解码中,指令指针从不递减。与堆栈不同,指令流在内存中向上增长。减量只会发生在分支的结果中,而您的问题明确禁止了分支。但我要打破规则并指出,当执行分支时(例如,通过无条件的
jmp
、条件跳转或
调用
),指令指针会显式更改以匹配分支的目标。

Ok,我只包括递减,因为据我所知,它可以按顺序运行,但向下运行,而不是递增。不是因为对那部分感到抱歉。然后它基本上增加了操作码和操作数的大小。对,它必须增加指令的精确大小。它不能只是猜测。不像一些流行的RISC体系结构,所有指令都有固定的长度,x86指令的长度变化很大。你确定这部分不是汇编程序处理的吗?与汇编程序编码的指令一样,它是一个32位的字,允许400万个操作码和一些可能的操作码。然后进行缩减,以便根据操作码,操作数可以是32位字中的位。如果是这样,那么IP+1到下一条指令将是一件简单的事情。如果设计者决定对指令使用固定宽度编码,那么是的,这是可能的。这将大大简化解码过程,因此所需的硅材料也将大大减少。但不,x86不是这样工作的,主要是出于历史原因。流中的每条指令可以而且通常都有不同的长度,最多15个字节。@marshalcraft:这正是大多数固定宽度指令集的工作方式。一些操作码使用大部分位作为操作数,而另一些操作码使用更多位在不需要那么多操作数位的不同操作码之间进行选择。AVR就是一个很好的例子。16位指令,32个寄存器,每个寄存器8位(有些指令只能使用上面的16个寄存器,因为它们只使用4位对寄存器进行编码)。指令集非常小,文档显示了编码中哪些位表示什么。例如