2017-01-24 77 views
0

我有%ecx包含希望將%esi的值移到左側的位置數,但對於我的理解,shl的源必須是立即值。在寄存器中按值轉換位

有人可以幫助我理解我將如何轉移%ecx的價值嗎?我環顧四周,看到有人推薦使用CL寄存器。但是有沒有其他選擇?

謝謝。

回答

0

80386架構提供了與移位量%cl,其掩蔽31雙字移,15字的變化,等。注意,%cl寄存器是%ecx寄存器的最低8位左移位指令:

0  8  16    32        64 
+---------------------------------------------------------------+ 
| rcx               | 
+-------------------------------+-------------------------------+ 
| ecx       | 
+---------------+---------------+ 
| cx   | 
+-------+-------+ 
| cl | ch | 
+-------+-------+ 

因此,shll %cl,%esi已經做了你所期望的和移動的%esi通過在%ecx指定爲高位真的不重要反正名額內容(偏移量與31轉向之前被屏蔽) 。

+1

...或63位64位寄存器掩碼 – Anty

+0

對於程序來說,高位實際上可能很重要,在這種情況下,必須特別注意將結果清零。你可能會認爲'1 << 33'是'0'而不是'2'。 – Jester

+0

@Jester這是正確的。但是,由於shll會將31位移位操作數屏蔽掉,因此無論如何將ecx中的任何高位設置爲無效,都無關緊要。 – fuz