为什么不允许Xor'ing DS?

时间:2019-04-11 19:40:18

标签: assembly x86 real-mode

我正在以实模式x86程序集编写程序,而我正试图这样做:

xor %ds, %ds

代替其他选择:

mov $0, %ax
mov %ax, %ds

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

Error: operand type mismatch for `xor'

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

2 个答案:

答案 0 :(得分:2)

问“为什么”采用这种方式本质上不是编程问题,而是对ISA设计者为什么选择采用这种方式进行设计的疑问。

XOR指令的

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

答案 1 :(得分:2)

  

有没有办法解决这个问题以减小代码大小?

最短的方法似乎如下:

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

如果我没有记错的话,这比使用mov $0,%ax的变体短一个字节。

  

您知道为什么他们选择不允许段寄存器作为xor的操作数吗?知道这将很有趣。

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

并且由于不允许自己使用xor-ing ax更加困难,因此CPU不仅允许对两个不同的寄存器(如xor %bx,%ax)进行操作,而且还允许两个参数使用相同寄存器的操作。

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

段寄存器的唯一目的是存储一个内存段;这些寄存器不打算存储任何其他类型的信息。

在极少数情况下,对内存段进行算术(或按位)运算才有意义。例如,如果阵列的长度大于64 KiB,则添加一个实例。在这种情况下,add操作可能会有用。

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

我认为,出于这个原因,CPU的设计者决定不提供任何算术运算,因此他们可以设计价格更便宜的CPU(请参阅Margaret Bloom的评论)。