2014-12-13 50 views
1

我通过“XCHG RAX,RAX”(xchg.xorpd.net)的谜语工作。这些是关于x86_64汇编的谜语,您必须了解代码片段的功能。这是谜语数为0x15:了解小汇编代码与一个奇怪的不断

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

好像这段代码是为了提高在某种程度上RAX里面的价值,虽然我不完全了解。 我试图给出一些输入和输出,但我还没有设法理解此代码的作用。什么是0xffffffff80000000数字? 有人能指出我对解决方案的正确方向吗?我真的很好奇这件事。

+0

没有上下文(xorpd不提供),就很难说了。不过,如果你采用32位数字并设置最重要的位数,那么会给你-2,147,483,648。使用64位数字表示该值可为您提供FFFFFFFF80000000。那可能有什么意义?不知道。唯一的用处是我可以看到将64位数字(正数和负数)转换为32位数字的奇怪方式。 FWIW。 – 2014-12-13 09:14:44

回答

1

我不确定“增强”应该是什么意思,但假设rax的上半部分为零,它将eax标记为rax

首先,观察加为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到所有的人。

而且可以将这些步骤相结合,让你的原代码。

或者,你可以认为它不是将rax减半,而是将其“减半”,因此将该否定处理应用于从最高位eax开始的33位数。

+0

酷,签名扩展!这正是CDQE所做的。谢谢:) – dedthecool 2014-12-13 19:16:50

+0

@dedthecool很好,如果上半部分不是零,'cdqe'仍然有符号扩展,而这只会继续并产生一个奇怪的结果。 – harold 2014-12-13 20:23:30