我在网上看过微软过去提出的面试问题样本,并且遇到了这个问题:
以下asm块执行常见的数学函数,它是什么?
Run Code Online (Sandbox Code Playgroud)cwd xor ax, dx sub ax, dx
有人可以回答这个并向我解释答案吗?谢谢!!
更新:好的,所以它计算绝对值.有人可以一步一步地解释它是如何做到的吗?即解释什么放在每个指令中的哪个寄存器和在哪些寄存器上执行的alu操作等等.谢谢!
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.
求绝对值
它只在 AX/EAX 上运行 - 它会破坏寄存器 (DX/EDX) - 在 Pentium 和更新的处理器上可以更快地完成 问题在于 CWD 指令。要替换 CWD,可以使用以下组合:mov dx,ax sar dx,15(如果使用 32 位寄存器,则以值 31 进行移位。)
cwd- 将字转换为双字。
异或 ax, dx => ax = ax 异或 dx
| 归档时间: |
|
| 查看次数: |
3081 次 |
| 最近记录: |