微软ASM采访问题?

5 x86 assembly

我在网上看过微软过去提出的面试问题样本,并且遇到了这个问题:

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

cwd xor ax, dx
sub ax, dx
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*kis 7

cwd xor ax, dx

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

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

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

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


rah*_*hul 1

求绝对值

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

cwd- 将字转换为双字。

异或 ax, dx => ax = ax 异或 dx

  • 老兄,这是汇编器。这是一步一步的。 (10认同)