所有x86 cpu都有指令指针寄存器,它保存下一条要执行的指令的偏移量(地址).如果没有分支或跳转,那么下一条获取指令的递增(或递减)的典型量是多少?我认为这可能是32位典型指令的大小?
它不能简单地通过"典型"指令的大小递增它,因为在x86架构中没有"通常大小"的指令.指令有各种奇怪的,不同的大小,以及各种可选前缀的可能性.(虽然有一个上限:指令只能包括至多 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%的总功耗来自解码指令.但是,这种复杂性至少有一个好处:增加指令密度.可变长度指令编码意味着某些常用指令只能使用几个字节进行编码,因此在指令高速缓存中占用的空间非常小.所以你有一个经典的工程权衡,在指令解码器更大更复杂的情况下,指令缓存可以做得更小,因此更便宜.
注意,指令指针永远不会在正常的"直线"解码中递减.与堆栈不同,指令流在内存中向上增长.只有分支才能实现减量,而您的问题明确禁止分支.但是我将违反规则并指出,当执行分支时(例如,通过无条件jmp,条件跳转或a call),指令指针被明确地改变以匹配分支的目标.
| 归档时间: |
|
| 查看次数: |
774 次 |
| 最近记录: |