2013-06-25 65 views
3

我已經看到邏輯左移可以做1-31位的移位形式。算術右移和邏輯右移取1-32作爲移位量。爲什麼左右輪班的區別?爲什麼邏輯右移和算術右移有一個移位範圍1-32

+1

因爲你可能想要0x80000000和'shr'它32次產生一個0.但是採取'0x00000001'並且執行'lsh' 32次只會將設置位從int的末尾轉儲出來,的整數溢出。 –

+0

請指定指令集 –

+0

指令集是arm v7 – Gautam

回答

3

它與某些輪班操作的特殊含義有關。從DDI 0029E(的ARM7TDMI數據表):

LSL#0是特殊情況,其中,所述移位器進行是CPSRÇ 標誌的舊值。 Rm的內容直接用作第二個操作數。
....
可能預期對應於LSR#0的移位字段的形式用於 編碼LSR#32,其具有以Rm的位31作爲進位輸出的零結果。邏輯 右移零是多餘的,因爲它與邏輯移位左零相同,所以彙編器 將把LSR#0(以及ASR#0和ROR#0)轉換爲LSL#0,並且允許LSR#32爲 SPECI網絡版。

換句話說,處理器設計者指定一個特殊的意義LSL #0,這也意味着有一個爲LSL #32沒有可能的編碼自1..31移位量被解釋爲-是和0有其特殊的意義。 LSR #0ASR #0將被彙編器轉換爲LSL #0,因爲它們具有相同的意義,這意味着機器代碼編碼LSR #0ASR #0自由使用別的東西;所以他們將0的位移量解釋爲LSR/ASR的32。

0

我認爲這與ARM桶式移位器有關。基本上ARM架構沒有真正的移位指令。相反,它使您可以使用桶形移位器作爲其他指令的一部分進行輪班。

在處理接受換班的指令之前,處理器將檢查換檔是否被指定。如果不是所應用的默認移位是LSL#0。

現在,寄存器將被移位的數量可以在指令的5位字段中指定,也可以在寄存器的底部字節中指定。但是,使用5位字段沒有額外的開銷,而使用寄存器需要額外的週期。

5位給你32個不同的值。由於當我們不想應用任何移位時,我們需要有一個0值,因此LSL的可能值範圍爲0-31,而LSR和ASR的範圍爲1-32,因爲您不需要執行LSR# 0或ASR#0。

對於LSR#32或ASR#32,如果要將寄存器的值設置爲零或1,並知道最後一位要移位的位置,那麼它們可能很有用,因爲它將移入進位位。