当前位置: 首页 > 知识库问答 >
问题:

到分段寄存器的mov比到通用寄存器的mov慢吗?

柯子琪
2023-03-14

具体是:

mov %eax, %ds
mov %eax, %ebx

注意,我关心的是旧的x86 linux CPU,而不是现代的x86_64 CPU,那里的分段工作方式不同。

共有1个答案

松鸣
2023-03-14

通用寄存器之间的MOV%EAX、%EBX是最常见的指令之一。现代硬件非常有效地支持它,通常具有不适用于任何其他指令的特殊情况。在旧的硬件上,它一直是最便宜的指令之一。

在Ivybridge和以后的版本中,它甚至不需要执行单元,并且具有零延迟。它在寄存器重命名阶段处理。x86的MOV真的能“免费”吗?为什么我根本不能复制这个?即使在早期的CPU上,任何ALU端口都是1 uop(因此通常每个时钟吞吐量为3或4 uop)。

在AMD Piledriver/SteamRolly,MOV r32、r32和r64上,r64可以在AGU端口和ALU端口上运行,使其每时钟吞吐量为4个,而add或MOV在8位或16位寄存器(必须合并到目的地)上每时钟吞吐量为2个。

    null

其他CPU类似:

>

  • ppro/pii/piii(原始P6):p0的8个uops,没有列出吞吐量。5周期潜伏期。(请记住,这个uarch是在1995年发布之前设计的,当时16位代码仍然很常见。这就是为什么P6-family对整数寄存器(AL,AH与AX分开)进行部分寄存器重命名)
  • Pentium4:4个uops+4个微码,14C吞吐量。

    延迟=12C 16位实值或vm86模式,24C 32位保护模式。12c是他在主表中列出的,所以他对其他CPU的延迟数可能也是实模式延迟,其中编写段reg只设置base=sreg<<4。)

    Skylake(我的测试用循环外读取的值重新加载它们):在一个只有dec/jnz的循环中:10个融合域UOP(前端),6个未融合域(执行单元)。每18C吞吐量一个。

    在一个循环中,对4个不同的seg regs(DS/ES/FS/Gs)都使用相同的选择器:每25C吞吐量4个MOV,6个融合/未融合域UOP。(也许有些被取消了?)

    在一个循环中,向ds4次写入:每72C一个iter(每18C一个MOV ds、EAX)。相同的uop计数:每mov有6个融合和未融合。

    >

  • K7/K8/K10:6“OPS”,8C吞吐量。

    Atom:7 uops,21C吞吐量

    有序奔腾(P5/PMMX)有更便宜的MOV-to-SR:Agner将其列为“>=2个循环”,且不可配对。(P5是有序的2宽超标量,有一些配对规则,指令可以在这些规则上一起执行)。对于保护模式来说,这似乎很便宜,所以也许2是在真实模式下,保护模式是大于?我们从他的P4表笔记中知道,他当时在16位模式下测试东西。

    他说Sandybridge“可能”可以重命名segment regs,Haswell/Broadwell/Skylake“可能”可以重命名它们。我在SKL上的快速测试表明,重复编写相同的段reg比编写不同的段reg慢,这表明它们没有完全重命名。放弃支持似乎是一件显而易见的事情,因为它们很少在普通的32/64位代码中被修改。

    而且每个seg reg通常一次只修改一次,因此对于同一段寄存器来说,多个dep链并不是很有用。(也就是说,在Linux中,对于段regs,您不会看到WAW的危险,而且WAR也几乎不相关,因为内核不会使用用户空间的DS来引用内核入口点中的任何内存。(我认为中断是序列化的,但是通过syscall进入内核可能仍然会有用户空间加载或存储,但还没有执行。)

    在第2章中,它解释了一般的无序执行(除了P1/PMMX之外的所有CPU),2.2寄存器重命名说“可能会重命名段寄存器”,但IDK如果他的意思是一些CPU可以重命名而一些不可以重命名,或者如果他不确定一些旧的CPU。他没有在PII/PII或Pentium-M部分提到seg reg的重命名,所以我不能告诉你你显然在问的旧的32位专用CPU。(他在K8之前没有AMD的微弓引导部分。)

    FS和GS在长模式下的工作与在保护模式下的工作基本相同,这是其他seg regs在长模式下被“绝育”。我认为Agner Fog的Core2/Nehalem数字可能与保护模式下的PIII类似。它们是同一个微架构家族的一部分。我不认为我们有一个有用的数字P5奔腾段寄存器写在保护模式。

    (Sandybridge是从P6-family派生出来的一个新家族中的第一个,其内部发生了重大变化,P4的一些想法实现了一种不同(更好)的方式,例如,SnB的decoded-uop缓存不是跟踪缓存。但更重要的是,SnB使用物理寄存器文件,而不是将值正确地保存在ROB中,因此它的寄存器重命名机制是不同的。)

  •  类似资料:
    • 在x86-64中,如果某些通用寄存器比其他寄存器更受欢迎,某些指令会执行得更快吗? 例如,会比执行得更快吗?我可以想象后者需要一个REX前缀,这会使指令获取速度变慢? 使用代替怎么样?或呢?其他操作?更小的寄存器,如vs?vs? AMD vs Intel?更新的处理器?较旧的处理器?指令的组合? 澄清:某些通用登记册是否应该优先于其他登记册,它们是哪些?

    • 3、段寄存器的引用 段寄存器是因为对内存的分段管理而设置的。16位CPU有四个段寄存器,所以,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图2.7所示。 段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。 段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另

    • 2.1 通用 CPU 寄存器 CPU 的寄存器能够对少量的数据进行快速的存取访问。在 x86 指令集里,一个 CPU 有 八个通用寄存器:EAX, EDX, ECX, ESI, EDI, EBP, ESP 和 EBX。还有很多别的寄存器,遇 到的时候具体讲解。这八个通用寄存器各有不同的用途,了解它们的作用对于我们设计调试 器是至关重要的。让我们先简略的看一看每个寄存器和功能。最后我们将通过一个简单

    • Vim提供了许多寄存器。可以将这些寄存器用作多个剪贴板。使用多个文件时,此功能非常有用。在本章中,将讨论以下主题内容 - 复制寄存器中的文本 粘贴寄存器中的文本 列出可用的寄存器 寄存器类型 1. 复制寄存器中的文本 对于复制,可以使用普通的命令,即并将其存储在寄存器中,可以使用以下语法 - 例如,要复制寄存器中的文本,请使用以下命令 - 2. 粘贴寄存器中的文本 从寄存器粘贴文本 - 例如,下面

    • 当前的Perl 5虚拟机是一台堆栈机器。 它通过将操作保持在堆栈上来传递操作之间的值。 操作将值加载到堆栈上,执行他们需要执行的操作并将结果放回堆栈。 这很容易使用,但速度很慢。 要将两个数字相加,您需要执行三次堆栈推送和两次堆栈弹出。 更糟糕的是,堆栈必须在运行时增长,这意味着在您不想分配内存时分配内存。 因此,Parrot将打破虚拟机的既定传统,并使用寄存器架构,更类似于真实硬件CPU的架构。

    • 处理器操作主要涉及处理数据。 该数据可以存储在存储器中并从其上访问。 然而,从存储器读取数据和将数据存储到存储器中会降低处理器的速度,因为它涉及通过控制总线向存储器存储单元发送数据请求并通过相同通道获取数据的复杂过程。 为了加速处理器操作,处理器包括一些内部存储器存储位置,称为registers 。 寄存器存储数据元素以便处理而无需访问存储器。 处理器芯片内置有限数量的寄存器。 处理器寄存器 IA