我已經看到邏輯左移可以做1-31位的移位形式。算術右移和邏輯右移取1-32作爲移位量。爲什麼左右輪班的區別?爲什麼邏輯右移和算術右移有一個移位範圍1-32
回答
它與某些輪班操作的特殊含義有關。從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 #0
和ASR #0
將被彙編器轉換爲LSL #0
,因爲它們具有相同的意義,這意味着機器代碼編碼爲LSR #0
和ASR #0
自由使用別的東西;所以他們將0的位移量解釋爲LSR/ASR
的32。
我認爲這與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,並知道最後一位要移位的位置,那麼它們可能很有用,因爲它將移入進位位。
- 1. 請解釋邏輯右移,算術右移和右旋之間的區別
- 2. 邏輯,算術按位移
- 3. 從ADD和NAND向右移位邏輯?
- 4. 邏輯和算術移位的輸出
- 5. 邏輯右移操作
- 6. 算術右移一個size_t值
- 7. 攤位算法和右移
- 8. Verilog中的算術右移
- 9. 大會 - 算術右移(SAR)
- 10. 算術移位作爲一個邏輯移位,無論簽署變量
- 11. 右移算術和十六進制數
- 12. 爲什麼UIView右移offsetBy
- 13. 爲展位算法實現算術右移
- 14. 在C中實現邏輯右移C
- 15. 爲什麼在Java中有兩個右移運算符和只有一個左移運算符?
- 16. 算術右移給假結果?
- 17. 對有符號整數進行邏輯右移運算
- 18. 按位和左/右移
- 19. 算術移位
- 20. android layout:edittext右移和左移
- 21. 邏輯移位和旋轉
- 22. 向右移位運算功能
- 23. 爲什麼這個按位右移似乎不起作用?
- 24. 與右位移位奇怪的行爲
- 25. 使用ALU運算符的一個位置右桶移位?
- 26. 什麼是在iPhone上自動向左和向右移動撥片的邏輯?
- 27. LC3組件按位右移
- 28. 右移進位保存號
- 29. 按位右移大量
- 30. 預移位器會評估位移和算術運算嗎?
因爲你可能想要0x80000000和'shr'它32次產生一個0.但是採取'0x00000001'並且執行'lsh' 32次只會將設置位從int的末尾轉儲出來,的整數溢出。 –
請指定指令集 –
指令集是arm v7 – Gautam