2009-05-29 263 views
6

我看到这样的代码:因为它的使用累加寄存器为什么mov指令直接使用ax而不是两个段寄存器?

mov ds, cs 
mov es, cs 

是第一种方式速度快:

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

为什么我不能只是压缩这?但这似乎并不直观,因为cs和ds是段寄存器。还是有一些我不知道的限制?

我正在使用nasm。

回答

9

你不能mov段寄存器段寄存器 - 没有指令。

+0

当我。首先阅读你的回复,我没有听过即使你,但在NASM的文档中,果然,没有mov reg_dseg,reg_cseg指令。 – samoz 2009-05-29 20:57:17

+0

这不是原因,它是结果。 – 2009-05-29 20:58:25

+1

什么?我不明白你的意思是尼尔。 – samoz 2009-05-29 21:06:09

1

微处理器的所有指令只有很多处理器的空间。所以一个通用指令通常比几个特殊用途的指令更适用于很少使用的操作变化段寄存器。另外,对于某些处理器,指令的数量完全受限于架构 - 例如,原始8080处理器限制为256条指令,因为它们必须将操作码编码为单个字节。

1

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

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

现在x86处理器系列可以回溯到20世纪70年代CPU架构更简单的时代。在那些日子里,的概念非常重要 - ax是16位x86累加器。所有计算都在本寄存器中建立或“累积”,以便所有指令都可用。其他通用寄存器的使用范围更加有限。

由于指令基于所需的字节,因此需要尽可能少的字节来表示尽可能快的指令解码指令。为了尽可能缩短指令的使用时间,蓄电池的使用是最重要的。

在比较现代的CPU上,比如摩托罗拉680x0更多的通用寄存器具有更多的能力,这些先前是累加器的领域。在RISC CPU上,所有寄存器都像累加器一样灵活。我听说在64位模式下,当前的x86/amd64指令集现在受到的限制更少。

1

查看Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015“MOV Move”列“指令”。

mov r/m16, Sreg 

与“3.1.1:

的唯一的16位MOV到寄存器中被编码。在操作码汇总表” 3个指令列说明:

  • R/M16 - 使用的指令,其操作数大小 属性是16个比特的字通用寄存器或存储器操作数字通用寄存器。 :。AX,CX,DX,BX,SP,BP,SI,DI
  • SREG - 甲段寄存器

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

相关问题