微软ASM采访问题?

时间:2009-09-15 07:25:29

标签: assembly x86

我在线查看过去微软提出的面试问题样本,并发现了这个问题:

  

以下asm块执行a   常见的数学函数,它是什么?

cwd xor ax, dx
sub ax, dx

有人可以回答这个并向我解释答案吗?谢谢!

更新:好的,所以它计算绝对值。有人可以一步一步地解释它是如何做到的吗?即解释什么放在每个指令中的哪个寄存器和在哪些寄存器上执行的alu操作等等。谢谢!

3 个答案:

答案 0 :(得分:7)

cwd xor ax, dx

将AX中的单词转换为DX:AX中的双字。保留标志,保留值。因此,如果AX> = 0,则DX = 0并且如果AX <0。 0,DX = -1。

如果AX == 0,则XOR不执行任何操作。

如果AX&lt; 0,XOR反转AX的所有位。然后SUB将1加(或减去-1,无论如何:P)到AX。这是计算二进制数的2的补码的方法。

总而言之,该指令序列将AX的绝对值置于AX中,并根据符号设置DX。

答案 1 :(得分:4)

这是abs函数(ax)。

如果ax为肯定,则dx将变为0,并且没有任何变化。

如果ax为否定,dx将为0xffff,这会产生ax~ax - (-1),这是众所周知的计算方法{ {1}}以二进制补码表示。

答案 2 :(得分:1)

查找绝对值

它只能在AX / EAX上运行 - 它会破坏寄存器(DX / EDX) - 它可以在Pentium和更新的处理器上更快地完成问题是CWD指令。要替换CWD,您可以使用以下组合:mov dx,ax sar dx,15(如果使用32位寄存器,则使用值31移位。)

cwd-将单词转换成双字。

xor ax,dx =&gt; ax = ax xor dx

相关问题