X86

设计

x86架构是重要地可变指令长度的CISC（复杂指令集计算机，Complex Instruction Set Computer）。字组（word, 4位组）长度的存储器访问允许不对齐存储器地址，字组是以低位字节在前的顺序存储在存储器中。向后兼容性及Intel量产制程经常领先业界一直都是在x86架构的发展背后一股驱动力量（设计的需要决定了这项因素而常常导致批评，尤其是来自对手处理器的拥护者和理论界，他们对于一个被广泛认为是落后设计的架构的持续成功感到不解）。但在较新的微架构中，x86处理器会把x86指令转换为更像RISC的微指令再予执行，从而获得可与RISC比拟的超标量性能，而仍然保持向前兼容。x86架构的处理器一共有四种执行模式，分别是真实模式，保护模式，系统管理模式以及虚拟V86模式。

在这篇简短的文章中出现的指令和寄存器助忆符号的名称，都在Intel文件中有所指定以及使用在Intel汇编器（Assembler）中（和兼容的，比如微软的MASM、Borland的TASM、CAD-UL的as386等等）。一个以Intel语法指定的指令"mov al, 30h"与AT&T语法的"movb $0x30, %al"相当，都是会被转译为两个字节的机器代码"B0 30"（十六进制）。你可以发现在这段程序中的"mov"或"al"，都是原来的Intel助忆符号。如果我们想要的话，我们可以写一个汇编器由代码'move immediate byte hexadecimally encoded 30 into low half of the first register'（移动立即值比特十六进制编码30到第一个寄存器的低半部位），来产生相同的机器代码。然而，传统上汇编器（Assembler）一直使用Intel的助忆符号。

x86汇编语言会在x86汇编语言文章中有更详细的讨论。

实模式

在实模式下，存储器的访问是被区块开来。为了得到最后20比特的存储器地址，要将区块的地址往左移动4位，并且加上偏移的地址。因此，实模式下总共可以定址的空间是2²⁰字节，或者是1MB，于1979年是相当让人印象深刻的象征。在实模式下有两种定址模式：near和far。在far模式，区块跟偏移都需要被指定；在near模式，只需要偏移模式被指定，而存储器区块是由适当的区块寄存器获得。以数据而言是使用DS寄存器，代码是CS寄存器，堆栈是SS寄存器。举个例子，如果DS是A000h且SI是5677h，DS:SI会指向记忆体的绝对地址DS × 16 + SI = A5677h
在这种架构下，两对不同的区块／偏移可以指向一个相同的绝对地址。因此如果DS是A111h且SI是4567h，DS:SI会指向跟上一段相同的A5677h。除了异值同址重复性之外，这种架构无法同时一次拥有4个以上的区块。此外，CS、DS和SS是为了程序正确功能而必须的，因此仅仅只有ES可以被用来指向其他的地方。这种模式原本是为了与Intel 8085兼容，导致程序员永无止尽的痛苦。
除了以上所说的，8086也拥有16-bit的32K（其变种Intel 8088 是8-bit的64K）输入输出空间，以及一个由硬件支持的64K（一个区块）存储器堆栈。只有words（2字节）可以被推入到堆栈中。堆栈是由存储器的上端往下成长，他的底端是由SS:SP指向。有256个中断，可以由硬件或是软件同时组成。中断是可以串连在一起，使用堆栈来存储返回被中断的程序地址。

16位保护模式

Intel 80286可以在不改变任何东西下，支持8086的实模式16位软件，然而它也支持额外的工作模式称为保护模式，可以将可定址的物理内存扩展到16MB，可定址的虚拟内存最大到1GB。这是使用节区寄存器来存储在节区表格中的索引值。处理器中有两个这样的表格，分别为GDT和LDT，每一个可以存储最多8192个节区的描述子，每一个节区可以给予最大到64KB的存储器访问。节区表格提供一个24位的基底地址（base address），可以用此基底地址增加想要的偏移量来创造出一个绝对地址。此外，每一个节区可以被赋予四种权限等级中的一种（称为"rings"）。
尽管这个推出的功能是一项进步，但是他们并没有被广泛地使用，因为保护模式的操作系统无法运行当时的实模式软件。这样的能力只有在随后80386处理器的虚拟86模式中出现。
在同时，操作系统比如OS/2尝试使用类似乒乓的方法，让处理器在保护和实模式间切换。这样都会让计算机变慢且不安全，像是在实模式下的程序可以轻易地使计算机死机。OS/2也定义了限制性的程序设计规则允许"Family API"或"bound"程序可以在实模式或保护模式下运行。然而这是给原本为保护模式下设计的程序有关，反之则不然。保护模式程序并不支持节区选择子和物理内存之间的关系。有时候会错误地相信在16位保护模式下运行实模式的程序，导致IBM必须选择使用Intel保留给BIOS的中断调用。事实上这类的程序使用任意的选择子数值和使用在上面提到的“节区运算”的方式有关。
这个问题也在Windows 3.x上出现。这个推出版本想要在16位保护模式下运行程序，而先前的版本只能在实模式下运行。理论上，如果Windows 1.x或2.x程序是写得“适当”且避免使用节区运算的方式，它就有可能在真实和保护模式两者下运行。Windows程序一般来说都会避免节区运算，这是因为Windows实现出软件的虚拟内存方式，及当程序不运行时候，搬移存储器中的代码和数据，所以操作绝对地址的方式是很危险的；当程序不运行时，被认为要保持存储器区块的“handles”，这样的handles已经非常相当于保护模式的选择子。在保护模式下的Windows 3.0运行一个旧的程序，会触发一个警告对话盒，建议在实模式下运行Windows（推测还是仍然可以使用扩展存储器，可能是在80386机器用EMM386模拟，因此它并不被局限于640KB）或是从厂商那更新到新的版本。好的行为之程序可能可以使用特别的工具来避免这样的对话盒。不可能有些GUI程序在16位保护模式下运行，且其它GUI程序在实模式运行，可能是因为这会需要两个分开的环境且会依于前面所提到的处理器在两个模式间的乒乓效应。从Windows 3.1版开始，实模式就消失了。

32位保护模式

Intel 80386推出后，也许是到当前为止x86架构的最大跃进。除了需要值得注意的Intel 80386SX是32位架构但仅只有24位定址（和16位数据总线）。除此之外其他架构都是32位 - 所有的寄存器、指令集、输出输入空间和存储器定址。为了能够在后者所说的功能工作，要使用32位扩展的保护模式。然而不像286，386所有的区块可以使用32位的偏移量，即使存储器空间有使用区块，但也允许应用程序访问超过4GB空间而不需要区块的分隔。此外，32位保护模式提供标签页的支持，是一种让虚拟内存得以实现的机制。
没有新的通用寄存器被加入。所有16位的寄存器除了区块寄存器外都扩展为32位。Intel在寄存器的助记符号上加入“E”来表示（因此扩展的AX变成EAX，SI变成ESI，依此类推）。因为有更多的寄存器数量、指令、和运算单元，因此机器代码的格式也被扩展。为了提供与先前的架构兼容，包含运行码的区块可以被标示为16或是32位的指令集。此外，特殊的前置符号也可以用来在16位的区块包含32位的脚本，反之亦然。
标签页跟区块的存储器访问是为了支持现在多任务操作系统所必须要的。Linux、386BSD、Windows NT和Windows 95都是一开始为386所发展，因为它是第一颗提供可靠地程序分离存储器空间的支持（每个程序拥有自己的定址空间）以及可以在必要的情况下打断他们程序的运行（使用ring，一种x86保护模式下权力分级的名称）。这种386的基本架构变成未来所有x86系列发展的基础。
Intel 80386数学辅助运算处理器也在集成到这个CPU之后的x86系列中，也就是Intel 80486。新的FPU可以帮助浮点数运算，对于科学计算和图形设计是非常重要。

系统管理模式

Intel首次在80386SL之后引入其x86体系结构。

MMX和之后

1996年Intel的MMX（AMD认为这是矩阵数学扩展Matrix Math Extensions的缩写，但大多数时候都被当成Multi-Media Extension，而Intel从来没有官方宣布过词源）技术出现。尽管这项新的科技得到广泛宣传，但它的精髓是非常简单的：MMX定义了八个64位SIMD寄存器，与Intel Pentium处理器的FPU堆栈有相重叠。不幸的是，这些指令无法非常简单地对应到由原来C编译器所产生的脚本中。MMX也只局限于整数的运算。这项技术的缺点导致MMX在它早期的存在有轻微的影响。现今，MMX通常是用在某些2D影片应用程序中。

3DNow!

1997年AMD推出3DNow!，是对于MMX的SIMD的浮点指令增强（针对相同的MMX寄存器）。尽管这些也没有解决编译器的难题，但这项技术的推出匹配了PC上的3D休闲娱乐应用程序之崛起。3D游戏开发者和3D绘图硬件制造商在AMD的AMD K6和Athlon系列处理器上，使用3DNow!来帮助增加他们的性能。微软后来也在其开发的Direct X7.0中加入针对3DNow!的最优化，使当时的Athlon处理器在3D游戏性能上首次全面超过对手英特尔的Pentium 3处理器。

SSE

在1999年Intel推出SSE指令集，增加了八个新的128-bit寄存器（不跟其他的寄存器重叠使用）。这些指令类似于AMD的3DNow!，主要是增加浮点数运算的SIMD指令。

SSE3

于2004年随着Pentium 4处理器的改版Prescott核心推出。SSE3增加特定的存储器和thread-handling指令来提升Intel超线程的性能，在科学计算方面也有增强。

SSE4

2007年1月，Intel公开发表使用其45奈米制程"Penryn"芯片家族的PC和服务器。"Penryn"是这一系列依据英代尔Core微架构之笔记本电脑、台式机和服务器芯片家族的代号，首次正式发布时共有16款处理器，除了一款Intel Core 2 Extreme QX9650是针对普通台式机市场外，其余的双核Xeon 5200系列和四核5400系列都是服务器处理器。基本上Penryn是继Merom之后的缩小版Core 2 Duo，再加上47条新的SSE4指令集等额外配备。SSE4指令集之首次发表时间为2006年9月的英特尔开发者论坛（IDF，Intel Developer Forum）。
另外，x86处理器制造厂商超微也在该公司K10架构的Phenom处理器中，加入4条新的SSE4A指令集。注意，SSE4与SSE4A无法彼此兼容。

16位

自Intel 8086和8088起，有14个16比特寄存器。其中四个（AX, BX, CX, DX）是通用目的（尽管每个寄存器都有附加目的；举个例子：只有CX可以被用来当作loop（循环）指令的计数器。）每个寄存器可以被当成两个分开的字节访问（因此BX的高比特可以被当成BH，低比特则可以当成BL）。除了这些寄存器，还有四个区块寄存器（CS、DS、SS、ES）。他们用来产生存储器的绝对地址。还有两个指针寄存器（SP是指向堆栈的底部，BP可以用来指向堆栈或存储器的其它地方）。两个指针寄存器（SI和DI）可以用来指向数组的内部。最后，有旗标寄存器（包含状态旗标比如进位、溢出、结果为零，等等）。以及IP是用来指向当前运行指令的地址。

32位

自Intel 80386起，四个通用寄存器（EAX, EBX, ECX, EDX），它们较低的16位分别与原本16位的通用寄存器（AX, BX, CX, DX）重叠共享。指针寄存器（EIP, EBP, ESP, ESI, EDI）。区块寄存器除了原本的（CS、DS、SS、ES），另外新增（FS、GS），但是区块寄存器在32位模式下改做为存储器区块的选择子寄存器。旗标寄存器被扩展为32位，较低的16位与原本在16位下的旗标寄存器重叠共享。

64位

MMX寄存器（MM0～MM7），它们分别与浮点运算器〈FP0～FP7〉相重叠，所以MMX与浮点运算不可同时使用，必须透过切换选择要使用哪一种。

AMD64

英特尔原本已经决定在64位的世代推出新的架构IA-64技术的Itanium处理器产品线来接替取代x86，但它与x86的软件天生不兼容，因此藉以各种形式来运行x86的软件，不过，效率十分低下，加之处理器本身和软件移植的成本难以控制，因此这个项目最终流产。
超微自行把32位x86（或称为IA-32）拓展为64位，并命名为x86-64或Hammer架构，而后更名为AMD64架构，并曾禁止使用之前的名字来称呼这一架构。以这个技术为基础的第一个产品是单核心的Opteron和Athlon 64处理器家族。由于AMD的64位处理器产品线首先进入市场，且微软也不愿意为英代尔代号为Yamhill的64位版x86处理器开发第三个不同的64位操作系统，英代尔被迫采纳AMD64架构且增加某些新的扩展到他们自己的产品，命名为EM64T架构（显然他们不想承认这些指令集是来自它的主要对手），EM64T后来被英代尔正式更名为Intel 64。
这个架构也被称为64位拓展架构，即x64，譬如四个通用寄存器（RAX, RBX, RCX, RDX）是由32位的（EAX, EBX, ECX, EDX）64位扩展而来，相应的还有 指针寄存器（RIP, RBP, RSP, RSI, RDI），以及增加八个通用寄存器（R8～R15）等等。 这些资源只可在x64处理器的64位模式下使用，在用来支持x86软件的遗留模式和兼容模式中是不可见的。

128位

自SSE起，SIMD的寄存器XMM0 - XMM15.

256比特

SIMD registers YMM0 - YMM15.

512位

SIMD registers ZMM0 - ZMM31.

虚拟

虚拟x86是很简单的，因为它的架构已经达到波佩克与戈德堡虚拟化需求。然而，有好几个商业的虚拟x86产品，比如VMware和微软的Virtual PC。Intel和AMD两者都有公开宣布未来的x86处理器将会有新的增强来容易达到更有效率的虚拟。Intel针对这项虚拟特性的代号称为"Vanderpool"和"Silvervale"；AMD则使用"Pacifica"这个代号。

指令码

长度为1、2或3字节，此外ModR/M中还可能有3位。对于双字节指令码或三字节指令码，其中的第1个字节为0FH，用于与指令前缀区分。

位移与立即数

某些寻址方式需要给出位移值。有些指令需要给出立即数作为操作数。