2015-02-07 59 views
1

我想與內聯彙編程序來實施可eax寄存器的值的函數,並把從eax每4位xor結果爲ebx,我想用執行它左移。獲取左移失去價值(內聯彙編)

假設的

eax value is : 1101.1010.0010.0011 
ebx value is : 0 

的價值我想從eaxxor做的4位左移失去價值與ebx值:

所以必須將結果:

eax : 1010.0010.0011.0000 
ebx : 1101 

下一個:

eax : 0010.0011.0000.0000 
ebx : 1101 xor 0010 = 1111 

下一頁:

eax : 0011.0000.0000.0000 
ebx : 1111 xor 0010 = 1101 

下一頁:

eax : 0000.0000.0000.0000 
ebx : 1101 xor 0011 = 1110 

如何獲得失去的價值?

+2

哦,來吧。你知道,這對於C或C++來說絕對是零。不要將它標記爲這樣。遵循這些標籤的人會這樣做,因爲這對他們來說很有趣。你沒有任何權利來欺騙那些人閱讀你的問題。 – hvd 2015-02-07 12:25:19

+0

好的,對不起,放輕鬆! – SingaCpp 2015-02-07 12:27:32

回答

0

通過預先保存。

例如:

mov ebx, eax 
shr eax, 4 
and ebx, 15 ; this is the "lost" value 
mov edx, eax 
shr eax, 4 
and edx, 15 
xor ebx, edx 
; etc 

所有這些and s的不是真的有必要,因爲高位不與任何其他位互動,你可以在計算中忽略他們,拋棄他們一下子最後只有一個and(我把這個留給讀者作爲練習)。

更好的是,因爲xor是關聯的,所以我們可以重新排列順序來獲得我們的優勢,同時取幾對。例如像這樣:

; first step 
mov ebx, eax 
shr eax, 8 
xor eax, ebx ; xor the first nibble with the third, and the second with the fourth 
; second step 
mov ebx, eax 
shr eax, 4 
xor ebx, eax ; (first^third)^(second^fourth) and some leftover junk 
; clean up 
and ebx, 15 ; remove junk 
+0

感謝您的快速響應,它的工作原理 – SingaCpp 2015-02-07 12:25:15

+0

@SingaCpp請尊重SO禮節並接受此答案。 – 2015-02-07 19:11:23