我在线查看过去微软提出的面试问题样本,并发现了这个问题:
以下asm块执行a 常见的数学函数,它是什么?
cwd xor ax, dx sub ax, dx
有人可以回答这个并向我解释答案吗?谢谢!
更新:好的,所以它计算绝对值。有人可以一步一步地解释它是如何做到的吗?即解释什么放在每个指令中的哪个寄存器和在哪些寄存器上执行的alu操作等等。谢谢!
答案 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