1

为什么不能直接将立即值移动到段注册表中(即 mov ds 10)?

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

.code
        mov AX,@data
        mov DS,AX

为什么不能直接通过以下方式完成:

        mov DS, @data

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

4

2 回答 2

4

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

X86 具有可变长度的操作码。它们的范围可以从一个字节(如 nop)到几个字节,如 movl $0xdeadbeef, 0x12345678(%ebx,%edx,1) 之类的 12 个字节英特尔决定不包含没有真正优势的指令。mov 段寄存器,就是其中之一。很可能是因为段寄存器不必经常更改。

因此,这节省了指令编码的空间,因此它节省了芯片上的几个晶体管(与今天的晶体管转储相比,可能不会那么多)。

其他 ISA,如 ARM 或 MIPS,它们的指令具有固定的编码大小,通常允许对所有寄存器进行相同的操作。在 ARM 的情况下,甚至 PC 也是一个普通的寄存器,也可以读写。

于 2012-06-20T16:12:51.940 回答
2

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

不过,您可以通过另一个临时注册表来编辑这些注册表。

于 2012-06-20T11:58:27.560 回答