我在某处读到 x86 指令中的有效地址(如 LEA 指令)是由“EU”计算的。什么是欧盟?计算有效地址究竟涉及什么?
我只了解了 MC68k 指令集(UC Boulder 首先教这个),我无法通过搜索网络找到好的 x86 网页。
我在某处读到 x86 指令中的有效地址(如 LEA 指令)是由“EU”计算的。什么是欧盟?计算有效地址究竟涉及什么?
我只了解了 MC68k 指令集(UC Boulder 首先教这个),我无法通过搜索网络找到好的 x86 网页。
英特尔自己的软件开发人员手册是有关 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 是其中一个)的指令提供什么样的内存地址,反映什么样的EU(或任何称为内存接口部分)的算术能力。
“第 2 卷”是指令集参考,包含所有指令(包括 LEA)的明确信息。
“EU”是执行单元的总称。ALU 是执行单元的一个示例。FADD 和 FMUL,即浮点加法器或乘法器,是其他示例 - 就这一点而言,是(是)用于加载和存储的存储单元。
与 LEA 指令相关的 EU 是 ALU(加、减、AND/OR 等)和 AGU(地址生成单元)。AGU 耦合到内存管道、TLB、数据缓存等。
当我编写第一个代码生成指南时,典型的 Intel x86 CPU 有 2 个 ALU、1 个连接到 AGU 的加载管道、一个连接到第二个 AGU 的存储地址管道和一个存储数据管道。截至 2016 年,大多数都有 3 或 4 个 ALU 和不止一个负载管道。
LEA 是一个 3 输入指令 - BaseReg+IndexReg*Scale+Offset。就像 x86 的内存寻址模式一样,它实际上有第四个输入,即段基址,它不是 LEA 计算的一部分。3 个投入的成本必然高于 ADD 所需的 2 个投入。
在某些机器上,ALU 只能执行 2 个输入操作。因此 LEA 只能在 AGU 上执行,特别是用于加载的 AGU(因为存储 ALU 不写入寄存器)。这可能意味着您不能在加载的同时执行 LEA,或同时执行两个 LEA,而您可以在同一个周期中执行两个 Adds 和一个加载。
在其他机器上,LEA 可以由一个、两个或三个 ALU 完成。可能代替 AGU - 可能和 ALU 一样。这证明了更大的灵活性。
或者,简单的 LEA,例如 reg scale+offset,可以在 ALU 上完成,而最大的 LEA,例如 breg+ireg scale+offset,可能会受到限制,甚至可能分解为两个微指令。
因此,问题归结为:哪个欧盟(执行单位)处理哪些 LEA?ALU 还是 AGU?答案取决于机器。
Generic text in an optimization guide may simply say "EU" rather than "AGU or ALU, depending on the model" or "whichever EU is capable of handling that particular LEA".
EU = 执行单位?
有效地址是如果LEA
指令是实际执行某种算术或其他数据访问的指令,则将被访问的地址。它的“预期”用途是从指针算术或数组索引操作计算结果指针。但是,因为它可以执行乘法和加法的某种组合,它也用于优化一些常规计算。
多年来,单个系列中处理器的内部结构发生了很大变化,因此需要使用确切的 cpu 模型来澄清“欧盟”参考。与您的 m68k 体验类似,68000、010、020、030、040 和 060 的指令集大部分相同,但它们的内部结构确实不同,因此任何对内部名称的引用都需要带有它们的部件号。