2

我正在解决“xchg rax,rax”(xchg.xorpd.net)的谜题。这些都是关于 x86_64 汇编的谜语,您必须了解代码片段的作用。这是谜语号 0x15:

mov      rdx,0xffffffff80000000
add      rax,rdx
xor      rax,rdx

似乎这段代码旨在以某种方式增强 rax 内部的价值,尽管我不完全理解如何。我试图提供一些输入和输出,但我还没有理解这段代码的作用。这个 0xffffffff80000000 数字是什么?有人可以为我指出解决方案的正确方向吗?我真的很好奇这个。

4

1 回答 1

2

我不确定“增强”应该是什么意思,但假设 的上半部分rax为零,它的符号扩展eaxrax.

首先,观察添加 0x80000000 然后与 0x80000000 进行异或运算对eax. 它们都反转最高位,并且偶数反转抵消。

但它是 64 位的,所以会发生一些事情:加法可以进位到上半部分的最低位。

为了简单起见,让我们假设他们是这样写的:

mov edx, 0x80000000
add rax, rdx
xor rax, rdx
mov rdx, 0xffffffff00000000
add rax, rdx
xor rax, rdx

现在前两条指令符号扩展为 33 位,将 的符号的副本放在eax的上半部分的最低位中rax。所以上半部分是 0 或 1,取决于 的符号eax

最后两行现在看起来很像通常的-x = ~(x - 1),但仅适用于上半部分,将 1 变为全1。

并且这些步骤可以组合起来,从而为您提供原始代码。

或者,您可以将其视为不是rax减半,而是将其“减半”,因此否定处理适用于从 的最高位开始的 33 位数字eax

于 2014-12-13T10:21:31.913 回答