2014-12-13 86 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