为什么mov指令直接使用ax而不是两个段寄存器?

时间:2009-05-29 20:50:27

标签: assembly x86 nasm accumulator addressing-mode

我看到的代码如下:

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

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

mov ds, cs
mov es, cs

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

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

4 个答案:

答案 0 :(得分:10)

你不能将段寄存器移动到段寄存器 - 没有指令。

答案 1 :(得分:1)

微处理器的处理器只有很多空间用于所有指令。因此,对于很少使用的操作湖改变段寄存器,一般指令通常优于几个特殊目的指令。此外,对于某些处理器,指令的数量绝对受到架构的限制 - 例如,原始8080处理器限制为256条指令,因为它们都必须在单个字节中编码操作码。

答案 2 :(得分:1)

它不是汇编语言,而是阻止这些操作的底层机器语言。

虽然汇编由易于阅读的单词或助记符组成,但它们实际上直接代表机器代码的1和0。在x86 CPU上,每条指令通常由一个字节序列组成,其中单个字节或字节内的偶数位具有含义。某些位表示指令,其他位表示addressing mode。在寄存器寻址模式(如示例)中,某些位表示哪些特定寄存器将用作mov指令的源和目标。

现在x86系列处理器可以追溯到20世纪70年代,当时CPU架构更简单。在那些日子里,accumulator的概念至关重要 - ax是16位x86累加器。所有的计算都是建立起来的,或者是积累的#34;在此寄存器中,所有指令均可使用。其他通用寄存器的使用范围更为有限。

因为指令基于字节,所以你需要尽可能少的字节来表示尽可能快地保持指令解码的指令。为了保持尽可能短的指令,累加器的使用是重中之重。

在更现代的CPU(如Motorola 680x0)上,更多通用寄存器具有更多功能,这些功能以前是累加器的域。在RISC CPU上,所有寄存器都与累加器一样灵活。我听说在64位模式下,当前的x86 / amd64指令集现在受到的限制要少得多。

答案 3 :(得分:1)

查看Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015" MOV Move"专栏"指令"。

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

1

和" 3.1.1.3操作码汇总表中的指令栏"说明:

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

因此mov r/m16, Sreg 无法编码,因为没有mov ds, cs版本。