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

标签 x86 cpu opcode

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

最佳答案

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

尽管许多流行的 RISC 处理器对指令使用固定宽度的编码(Alpha、MIPS 和 PowerPC 都有固定大小的 32 位指令,而安腾有固定大小的 41 位指令),但 Intel x86 使用一个变量-width 编码,主要是出于历史原因。这是一个非常复杂的 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),指令指针被显式更改以匹配分支的目标。

关于x86 - x86 处理器增加多少 IP 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41271586/

相关文章:

assembly - PC 启动 : dl register and drive number

jvm - 不同编程语言的字节码差异

异常 ColdFusion 应用程序的 Windows CPU 通知

PHP 尖峰 cpu 使用率

java - 使用 Java 访问内存

c# - 短指令有更好的性能吗?

assembly - asm中的ADC指令

winapi - Nasm ReadConsole输入

visual-studio - 为什么寄存器 ax 中的内存整数之和是正确的,而寄存器 eax 中的内存整数之和却不是正确的?

c - 用于 CPU 使用的 Linux C API