首页 文章

x86处理器增加IP寄存器的数量是多少?

提问于
浏览
3

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

1 回答

  • 7

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

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

    A generalized encoding schema for the various components of an x86 instruction.

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

    因此,处理器必须具有内部逻辑,该内部逻辑在指令解码过程中更新指令指针(IP) . 它获取指令,对其进行解码,并将指令指针增加解码指令的实际大小 . (也就是说,从程序员的高级角度来看 . 在内部,由于投机性执行,事情变得更加复杂 . )

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

    请注意,指令指针永远不会在正常情况下递减递减 . 与堆栈不同,指令流在内存中向上增长 . 只有分支才能实现减量,而您的问题明确禁止分支 . 但是我将违反规则并指出,当执行分支时(例如,通过无条件 jmp ,条件跳转或 call ),指令指针被显式改变以匹配分支的目标 .

相关问题