我正在研究" xchg rax,rax" (xchg.xorpd.net)。这些是关于x86_64汇编的谜语,你必须了解代码片段的作用。这是谜题号码0x15:
mov rdx,0xffffffff80000000
add rax,rdx
xor rax,rdx
看起来这段代码的目的是以某种方式增强rax内部的价值,尽管我并不完全理解。 我试图提供一些输入和输出,但我还没有设法理解这段代码的作用。这个0xffffffff80000000号码是什么? 有人能指出我正确的解决方案吗?我真的好奇这个。
答案 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位数字}}