2012-06-20 142 views
0

为什么直接值不能直接移入段注册表(即mov ds 10)?MOV指令限制

此外,为什么不能直接复制段寄存器(即mov es,ds)?

.code 
     mov AX,@data 
     mov DS,AX 

为什么不能这样直接被完成:

 mov DS, @data 

任何解释它为什么这样设计?

+1

*推测*你在说x86,x64架构?还有其他的,你知道的,其中一些*不会受到x86指令集中明显缺乏正交性的影响。请添加合适的标签。 –

+0

请重申您的问题,也许增加一些真实的例子。 –

回答

3

这里的主要问题是指令烯/解码

X86具有可变的长度的操作码。它们的范围可以从单个字节(如nop)到几个字节,如12字节,类似movl $ 0xdeadbeef,0x12345678(%ebx,%edx,1) 英特尔决定不包含没有提供真正优势的指令。 mov segmentregister,就是其中之一。最有可能的原因是,细分市场注册人不必经常更换。因此,这节省了指令编码的空间,因此可以节省芯片上的几个晶体管(与晶体管转储相比,可能不是那么多)。

其他类似于ARM或MIPS的ISA,它们的指令具有固定的编码大小,通常允许所有寄存器执行相同的操作。在ARM的情况下,即使PC是一个正常的寄存器,也可以读取一个写入。

+0

谢谢你的解释! –

2

因为不需要编辑这些注册表(除非在极少数情况下),因为它们是由操作系统设置的。那么为什么浪费硅来做一些无用的事情?

虽然您可以通过另一个临时编辑这些注册表。

+1

这只适用于32位代码,而不是16位代码。 –