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