用奇怪的常量理解小的asm代码

时间:2014-12-13 07:02:24

标签: assembly 64-bit reverse-engineering nasm yasm

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

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

看起来这段代码的目的是以某种方式增强rax内部的价值,尽管我并不完全理解。 我试图提供一些输入和输出,但我还没有设法理解这段代码的作用。这个0xffffffff80000000号码是什么? 有人能指出我正确的解决方案吗?我真的好奇这个。

1 个答案:

答案 0 :(得分:1)

我不确定“增强”是什么意思,但假设rax的上半部分为零,则将eax符号扩展为rax

首先,观察添加0x80000000然后使用0x80000000进行xoring将对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切成两半,而是将其切割为“略低于一半”,因此否定处理应用于从{{1的最高位开始的33位数字}}