Assembly 什么是「;欧盟";在x86体系结构中?(计算有效地址?)

Assembly 什么是「;欧盟";在x86体系结构中?(计算有效地址?),assembly,x86,cpu-architecture,Assembly,X86,Cpu Architecture,我在某处读到,x86指令中的有效地址(如LEA指令)由“EU”计算。EU是什么?计算一个有效地址到底涉及到什么 我只了解了MC68k指令集(UC Boulder先教这个),但通过搜索网页,我找不到一个好的x86网页 EU=执行单元 有效地址是如果LEA指令是实际执行某种算术或其他数据访问的指令,则会访问的地址。它的“预期”用途是通过指针算术或数组索引操作计算结果指针。但是,由于它可以执行乘法和加法的某些组合,因此它还用于优化某些常规计算。单个系列中的处理器内部多年来发生了很大变化,因此需要使用确

我在某处读到,x86指令中的有效地址(如LEA指令)由“EU”计算。EU是什么?计算一个有效地址到底涉及到什么

我只了解了MC68k指令集(UC Boulder先教这个),但通过搜索网页,我找不到一个好的x86网页

EU=执行单元


有效地址是如果
LEA
指令是实际执行某种算术或其他数据访问的指令,则会访问的地址。它的“预期”用途是通过指针算术或数组索引操作计算结果指针。但是,由于它可以执行乘法和加法的某些组合,因此它还用于优化某些常规计算。

单个系列中的处理器内部多年来发生了很大变化,因此需要使用确切的cpu模型来澄清“EU”参考。与您的m68k体验类似,68000、010、020、030、040和060的指令集基本相同,但它们的内部结构确实不同,因此任何对内部名称的引用都需要附带它们的零件号。

英特尔自己的是有关x86的一个很好的信息源,尽管它们可能有点过火(和更像参考,而不是教程)

EU(执行单元)引用最有可能与ALU(算术逻辑单元)形成对比,ALU通常是处理器中负责算术和逻辑指令的部分还有一些算术功能,用于计算内存地址。x86 LEA指令将这些功能传递给汇编程序员

通常,您可以为x86指令提供一些非常复杂的内存地址:

sub eax, [eax + ebx*4 + 0042]
当ALU处理算术减法时,EU负责生成地址

使用LEA,您可以将有限的地址生成功能用于其他目的:

lea ebx, [eax + ebx*4 + 0042]
与之相比:

mul ebx, 4
add ebx, eax
add ebx, 0042
我链接的页面上的“第1卷”有一节“3.7.5”讨论了寻址模式-您可以向期望内存操作数(其中LEA是一个)的指令提供什么类型的内存地址,反映EU(或内存接口部分被称为什么)能够实现什么类型的算术

“Volume 2”是指令集参考,包含所有指令的明确信息,包括LEA。“EU”是执行单元的通用术语。ALU是执行单元的一个示例。FADD和FMUL,即浮点加法器或乘法器,是其他示例-就这一点而言,是(is)内存单元,用于加载和存储

与LEA指令相关的EU是ALU(加法、减法和/或等)和AGU(地址生成单元)。AGU耦合到内存管道、TLB、数据缓存等

在我编写第一个codegen指南时,一个典型的Intel x86 CPU有2个ALU、1个连接到AGU的加载管道、一个连接到第二个AGU的存储地址管道和一个存储数据管道。截至2016年,大多数CPU都有3或4个ALU和多个加载管道

LEA是一个3输入指令-BaseReg+IndexReg*Scale+Offset。就像x86的内存寻址模式一样,它实际上有一个第4输入,即段基,这不是LEA计算的一部分。3输入的成本必然高于ADD所需的2输入

在某些机器上,ALU只能执行2个输入操作。因此,LEA只能在AGU上执行,特别是用于加载的AGU(因为存储ALU不写入寄存器)。这可能意味着您不能在加载的同时执行LEA,或者在同一时间执行两个LEA,而您可以在同一周期内执行两个加法和一个加载

在其他机器上,LEA可以由一个、两个或三个ALU完成。可能代替AGU,也可能代替ALU。这证明了更大的灵活性

或者,可以在ALU上执行简单的LEA,例如regscale+offset,而最大的LEA,例如breg+iregscale+offset,可能会受到限制,甚至可能会分成两个UOP

因此,问题归结为:哪个EU(执行单元)处理哪个LEA?ALU还是AGU?答案取决于机器


优化指南中的一般文本可能只是说“EU”,而不是“AGU或ALU,取决于型号”或“哪个EU能够处理特定LEA”。

我想知道哪个更快/更有效;LEA指令或mul、add、add组合,因为它们由不同的单元(EU/ALU)处理。今天的多阶段管道、多核、多单元真的很难说。当ALU忙时,EU可以免费进行这样的计算,反之亦然。见鬼,我甚至不确定EU/ALU的区别是否存在。ALU是EU的一种类型(可以运行加法和移位指令的类型)。其他类型是可以执行这些UOP的加载单元或存储单元。在这个问题上,将解释更多细节。(Andy Glew是Intel P6设计的架构师之一。他对Intel术语的解释是正确的,@TonyR应该接受这个答案)使用
lea
始终是一个胜利,如果你可以替换多条指令。如果你可以替换全部4条指令(shift、
add
add
-immediate和
mov
),这是一个巨大的胜利。这个答案将EU与AGU混淆。它所说的关于“EU”的一切实际上都应该替换为“AGU”。(注意,在现代x86设计中,只有为了使Atom在实际AGU硬件上运行LEA,而不是作为另一条ALU指令。其他CPU仅将其AGU用于实际加载/存储/预取。)有关x86硬件的详细信息,请参阅x86 CPU现在有3个ALU端口/管道和2个加载端口,除非您考虑低功耗设计