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