为什么不能将立即值直接移入段注册表(即mov ds 10)?
另外,为什么不能直接复制段寄存器(即mov es,ds)?
.code
mov AX,@data
mov DS,AX
为什么不能通过以下方式直接完成:
mov DS, @data
任何解释为什么这样设计?
答案 0 :(得分:4)
这里的主要问题是指令编码/解码
X86具有可变长度的操作码。它们可以从单个字节(如nop)到几个字节,例如12个字节,例如movl $ 0xdeadbeef,0x12345678(%ebx,%edx,1) 英特尔决定不包括没有真正优势的指令。 mov segmentregister,就是其中之一。很可能是因为段寄存器不必经常更改。
因此,这节省了指令编码的空间,因此它在芯片上节省了几个晶体管(与今天的晶体管转储相比,可能不是那么多)。
其他具有固定编码大小的ARM或MIPS等ISA通常允许对所有寄存器执行相同的操作。在ARM的情况下,即使PC是普通寄存器,也可以读写。
答案 1 :(得分:2)
因为它们是由操作系统设置的,所以不需要编辑这些注册表(在极少数情况下除外)。那么为什么浪费硅做一些无用的东西呢?
您可以通过另一个临时编辑来编辑这些注册表。