我看到这样的代码:

mov ax, cs
mov ds, ax
mov es, ax

为什么我不能将其压缩为:

mov ds, cs
mov es, cs

由于使用累加器寄存器,第一种方法是否更快?但这似乎不直观,因为 cs 和 ds 是段 寄存器. 。还是有一些我不知道的限制?

顺便说一句,我正在使用 nasm。

有帮助吗?

解决方案

您不能MOV段寄存器段寄存器 - 有没有它的指令

其他提示

有只有这么多室中的微码对其所有指令的处理器。所以一个普通的指令往往优于一些特殊用途的药粥很少uused操作湖泊变化的段寄存器。此外,对于一些处理器的指令的数量是绝对由体系结构的限制 - 例如,原来的8080处理器被限制为256个指令,因为它们都必须有在单个字节编码的操作码

这不是汇编语言真的,但其防止这些操作底层机器语言。

虽然组件是由容易高达读单词或助记符,它们实际上代表相当直接的机器代码的1和0。上x86 CPU的每个指令通常是由与单个字节或具有意义的字节内偶数比特字节序列的。某些位表示指令,其他代表寻址模式。在寄存器寻址模式,如你的例子一些比特表示哪些特定的寄存器将被用作mov指令的源和目的地。

现在处理器的x86家族回去的路还很长上世纪70年代,当CPU架构比较简单。在那些日子里的蓄电池概念是至关重要 - ax是16 86位累加器。所有的计算都建立或在该寄存器“积累”,因此它是提供给所有指令。其他通用寄存器具有使用一个更受限制的范围内。

由于指令是基于字节你想尽可能少的字节来表示尽可能的指令,以保持指令译码快。为了保持尽可能多的指令尽可能短的使用蓄能器的由中央。

在更现代的CPU如摩托罗拉680x0上多个通用寄存器具有更多的能力,以前的储液器的结构域。在RISC CPU的所有寄存器都为蓄电池灵活。听说在64位模式下的当前的x86 / AMD64指令集是受限制的,现在要少得多。

看着那(这 英特尔手册第 2 卷指令集参考 - 325383-056US 2015 年 9 月 “MOV移动”栏“指令”。

寄存器的唯一 16 位 mov 编码为:

mov r/m16, Sreg

而“3.1.1.3操作码汇总表中的指令栏”解释道:

  • r/m16 — 一个字通用寄存器或存储器操作数,用于操作数大小的指令 属性为 16 位。通用寄存器这个词是:AX、CX、DX、BX、SP、BP、SI、DI。
  • Sreg — 段寄存器。

因此 mov ds, cs 是不可编码的,因为没有 mov Sreg, Sreg 版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top