我在某处读到x86指令中的有效地址(如LEA指令中)由“EU”计算。什么是欧盟?计算有效地址究竟涉及什么?
我只学习了MC68k指令集(UC Boulder首先教这个),我找不到一个好的x86网页,通过网络搜索。
答案 0 :(得分:6)
英特尔自己的Software Developer's Manuals是关于x86的一个很好的信息来源,虽然它们可能有点过分(并且更像参考而非类似教程)。
EU(执行单元)参考最有可能与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为1)的指令提供哪种内存地址,反映EU(或任何称为存储器接口部分)能够进行何种算术运算。
“第2卷”是指令集参考,包含所有指令的确切信息,包括LEA。
答案 1 :(得分:4)
“EU”是执行单位的通用术语。 ALU是执行单元的一个示例。 FADD和FMUL,即浮点加法器或乘法器,是其他示例 - 因为,就此而言,它是存储器单元,用于加载和存储。
与LEA指令相关的EU是ALU(加,减,和/或等)和AGU(地址生成单元)。 AGU耦合到存储器管道,TLB,数据缓存等
当我编写第一个codegen指南时,典型的Intel x86 CPU有2个ALU,1个加载管道连接到AGU,存储地址管道连接到第二个AGU,以及存储数据管道。截至2016年,大多数都有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一样。这证明了更大的灵活性。
或者,简单的LEA,例如reg scale + offset,可以在ALU上完成,而最大的LEA,例如breg + ireg scale + offset,可能会被限制,甚至可能被破坏两个uops。
那么,问题归结为:哪个欧盟(执行单位)处理哪个LEA? ALU还是AGU?答案取决于机器。
优化指南中的通用文字可以简单地说“EU”而不是“AGU或ALU,具体取决于型号”或“欧盟能够处理该特定LEA”。
答案 2 :(得分:3)
欧盟=执行单位?
有效地址是LEA
指令是实际执行某种算术或其他数据访问的指令时可以访问的地址。它的“预期”用途是从指针算术或数组索引操作计算结果指针。但是,因为它可以执行乘法和加法的某种组合,所以它也用于优化一些常规计算。
答案 3 :(得分:0)
多年来,单个系列中处理器的内部结构发生了很大变化,因此需要使用确切的cpu模型来澄清“EU”参考。与m68k的经验类比,68000,010,0,020,040,040和060的指令集基本相同,但它们的内部结构确实不同,因此任何对内部名称的引用都需要附带其部件号。 / p>