第1天-ARM匯編指令LSL/LSR/ASL/ASR
LSL
ASL
LSR
ASR
ROR
RRX
ARM 處理器組建了可以與數據處理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel shifter)。你還可以使用桶式移位器影響在 LDR/STR 操作中的變址值。
譯注:移位操作在 ARM 指令集中不作為單獨的指令使用,它是指令格式中是一個(gè)字段,在匯編語(yǔ)言中表示為指令中的選項。如果數據處理指令的第二個(gè)操作數或者單一數據傳送指令中的變址是寄存器,則可以對它進(jìn)行各種移位操作。如果數據處理指令的第二個(gè)操作數是立即值,在指令中用 8 位立即值和 4 位循環(huán)移位來(lái)表示它,所以對大于 255 的立即值,匯編器嘗試通過(guò)在指令中設置循環(huán)移位數量來(lái)表示它,如果不能表示則生成一個(gè)錯誤。在邏輯類(lèi)指令中,邏輯運算指令由指令中 S 位的設置或清除來(lái)確定是否影響進(jìn)位標志,而比較指令的 S 位總是設置的。在單一數據傳送指令中指定移位的數量只能用立即值而不能用寄存器。
下面是給不同的移位類(lèi)型的六個(gè)助記符:
LSL 邏輯左移 ASL 算術(shù)左移 LSR 邏輯右移 ASR 算術(shù)右移 ROR 循環(huán)右移 RRX 帶擴展的循環(huán)右移
ASL 和 LSL 是等同的,可以自由互換。
你可以用一個(gè)立即值(從 0 到 31)指定移位數量,或用包含在 0 和 31 之間的一個(gè)值的寄存器指定移位數量。
邏輯或算術(shù)左移
(Logical or Arithmetic Shift Left)
Rx, LSL #n or Rx, ASL #n or Rx, LSL Rn or Rx, ASL Rn
接受 Rx 的內容并按用‘n’或在寄存器 Rn 中指定的數量向高有效位方向移位。最低有效位用零來(lái)填充。除了概念上的第 33 位(就是被移出的最小的那位)之外丟棄移出最左端的高位,如果邏輯類(lèi)指令中 S 位被設置了,則此位將成為從桶式移位器退出時(shí)進(jìn)位標志的值。
考慮下列:
MOV R1, #12 MOV R0, R1, LSL#2
在退出時(shí),R0 是 48。 這些指令形成的總和是 R0 = #12, LSL#2 等同于 BASIC 的 R0 = 12 << 2
邏輯右移
(Logical Shift Right)
Rx, LSR #n or Rx, LSR Rn
它在概念上與左移相對。把所有位向更低有效位方向移動(dòng)。如果邏輯類(lèi)指令中 S 位被設置了,則把最后被移出最右端的那位放置到進(jìn)位標志中。它同于 BASIC 的 register = value >>> shift。
算術(shù)右移
(Arithmetic Shift Right)
Rx, ASR #n or Rx, ASR Rn
類(lèi)似于 LSR,但使用要被移位的寄存器(Rx)的第 31 位的值來(lái)填充高位,用來(lái)保護補碼表示中的符號。如果邏輯類(lèi)指令中 S 位被設置了,則把最后被移出最右端的那位放置到進(jìn)位標志中。它同于 BASIC 的 register = value >> shift。
循環(huán)右移
(Rotate Right)
Rx, ROR #n or Rx, ROR Rn
循環(huán)右移類(lèi)似于邏輯右移,但是把從右側移出去的位放置到左側,如果邏輯類(lèi)指令中 S 位被設置了,則同時(shí)放置到進(jìn)位標志中,這就是位的‘循環(huán)’。一個(gè)移位量為 32 的操作將導致輸出與輸入完全一致,因為所有位都被移位了 32 個(gè)位置,又回到了開(kāi)始時(shí)的位置!
帶擴展的循環(huán)右移
(Rotate Right with extend)
Rx, RRX
這是一個(gè) ROR#0 操作,它向右移動(dòng)一個(gè)位置 - 不同之處是,它使用處理器的進(jìn)位標志來(lái)提供一個(gè)要被移位的 33 位的數量。
評論