Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 指令的解码形式是什么?_Assembly_X86_X86 64_Intel - Fatal编程技术网

Assembly 指令的解码形式是什么?

Assembly 指令的解码形式是什么?,assembly,x86,x86-64,intel,Assembly,X86,X86 64,Intel,我正在阅读乌尔里希·德雷珀的《每一位计算机科学家都应该知道的关于内存的知识》 第6.2.2节内容如下: […]指令必须在 它们可以被执行,并且,为了加速这一过程(很重要 在x86和x86-64)上,指令实际上缓存在 解码形式,而不是从中读取的字节/字形式 记忆 作者对指令的“解码”形式是什么意思?这些说明本身不是什么意思吗?“添加”是一个“添加”,例如 它的“解码”形式是什么?为什么他们需要缓存它?这不是决定性的吗?“解码”管道中的指令需要时间吗?为什么 您所认为的单个指令实际上(可能)对应于处

我正在阅读乌尔里希·德雷珀的《每一位计算机科学家都应该知道的关于内存的知识》

第6.2.2节内容如下:

[…]指令必须在 它们可以被执行,并且,为了加速这一过程(很重要 在x86和x86-64)上,指令实际上缓存在 解码形式,而不是从中读取的字节/字形式 记忆

作者对指令的“解码”形式是什么意思?这些说明本身不是什么意思吗?“添加”是一个“添加”,例如


它的“解码”形式是什么?为什么他们需要缓存它?这不是决定性的吗?“解码”管道中的指令需要时间吗?为什么

您所认为的单个指令实际上(可能)对应于处理器上的一整套不同电路。“解码”意味着机器代码被读取,并且一些元数据或处理器状态现在存在,用于选择正确的电路。比缓存代码更高效的缓存


例如,加载指令可能使用一种实现进行偏移寻址,而使用一种完全不同的电路进行即时寻址…

现代Intel CPU实际上使用所谓的。微码由编写在用于实现高级指令的较简单的低级指令集中的代码组成(例如,
rep
-前缀指令可以实现为微码循环)。因为这实际上需要CPU本身将输入指令流“编译”成微码,所以可以想象缓存的是这个微码(以避免重复编译它的开销)


当然,缓存“解码”指令的精确细节因处理器而异,因此不可能有一般性的说明。

CPU通常执行的三个步骤是:

  • 从存储器中取出指令

  • 解码(说明-您的问题)

  • 执行(根据解码阶段,让电信号在COU中移动)

  • 对指令进行解码意味着CPU“解码器”——CPU内部的硬件组件——对二进制指令进行解码,并根据指令决定如何处理电信号(指令)


    换句话说:指令被转换成控制CPU其他部分的信号。

    这不是在经典RISC管道中看到的解码步骤。在现代x86处理器中,指令在最终进入“生成控制信号”阶段之前要经过几个解码步骤。它们被“预编码”(识别指令边界),解码成µops,然后进行缓冲、缓存和排队,直到它们最终到达“类似RISC的核心”,在那里它们被调度并放入保留站,然后才最终到达ALU(如果适用)。在这条路线的大部分时间里,它们可能还没有按照经典的RISC意义上的“转化为实际控制信号”进行解码,这将使它们太宽,无法将1.5K的信号放入L1C。无论如何,前端生成的那些µOp是“类似RISC的内核”的指令集,它们不是传统意义上的状态机顺序生成一系列控制信号的真正微码。但这是可比的


    至于µops实际上是什么样子,很难得到具体的细节。可以从指令生成的µOp数(以及它们所连接的端口数)中做出一些推断,如表所示。例如,读操作指令和读修改写指令被分成若干部分。一些指令生成大量的µOp,例如浮点transcedentals,使这些指令更像是一种内置函数,可能是在其他指令之上实现的。执行可变工作量的指令也会生成可变数量的微操作,例如
    rep mov
    。所以µops看起来像RISC指令,但我们已经知道了。

    Wiki解释得很好,不,这不是Ulrich Drepper所说的。他说的是将指令解码成实际缓存的微操作。出于性能方面的考虑,现代英特尔处理器实际上使用的微码比它们的前辈少得多……乌尔里希·德雷珀(Ulrich Drepper)与这段对话有什么关系呢?德雷珀(Drepper)引用了该问题所问的话。与您编写的相反,通常只有简单的指令(最多4个UOP)可以被Intel CPU中的循环缓冲区缓存(2007年Drepper撰写内存文章时,CPU中就存在了循环缓冲区)。直到Sandybridge(大约2011年),Intel CPU才真正开始以更严肃的方式缓存解码的UOP,而不仅仅是针对当前循环。(). 所以我很惊讶德雷珀会这么说;现在的情况(SnB和Zen)比2007年更为真实。但无论如何,复杂的指令(如rep movsb)会间接连接到微码序列器,而微码序列器中的UOP不会被缓存。(sandybridge中的uop缓存(也称为DSB)可以存储该间接寻址,因此不必重新解码x86机器代码。)