我正在以实模式x86程序集编写程序,而我正试图这样做:
xor %ds, %ds
代替其他选择:
mov $0, %ax
mov %ax, %ds
但是,我遇到了一个汇编器错误:
Error: operand type mismatch for `xor'
这是为什么?有没有办法解决这个问题以减少代码大小?
答案 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的评论)。