为什么不允许异或 DS?

Why is xor'ing DS not allowed?

我正在用实模式 x86 汇编编写一个程序,我正在尝试这样做:

xor %ds, %ds

替代方案:

mov [=11=], %ax
mov %ax, %ds

但是,我遇到了一个汇编错误:

Error: operand type mismatch for `xor'

这是为什么?有没有办法解决这个问题以减少代码大小?

XOR 指令的

The encodings 不允许将段寄存器作为第一个或第二个操作数。您只能使用通用寄存器、内存位置和立即值。

Is there a way to get around this to decrease code size?

最短的路好像是下面这样:

xor %ax, %ax
mov %ax, %ds

如果我没记错的话,这比使用 mov [=11=], %ax 的变体短一个字节。

Do you know why they chose to not allow segment registers as operands for xor? That would be interesting to know.

我怀疑 CPU 的设计者是否打算将操作 xor %ax, %ax 用于将寄存器归零。相反,CPU 设计师希望 xor ax 可以与任何其他寄存器一起注册。

并且因为不允许 xor-ing ax 本身会更加困难,CPU 不仅允许对两个不同的寄存器进行操作(如 xor %bx, %ax) 以及对两个参数使用相同寄存器的操作。

对于段寄存器,这是不同的:

段寄存器的唯一用途就是存储一个内存段;这些寄存器不用于存储任何其他类型的信息。

只有极少数情况下,对内存段进行算术(或按位)运算才有意义。一个例子是在数组长于 64 KiB 的情况下添加;在这种情况下,add 操作可能会有用。

但是,在大多数情况下,您不会对表示内存段的值执行算术运算。

我认为 CPU 的设计者决定不提供任何算术运算,因此他们可以设计一个更便宜的 CPU(参见 Margaret Bloom 的评论)。