4. 邏輯與位元指令

4.1. 文件慣例

標記法:Rd, Rn 表示 ARM 暫存器 R0-R7,但在可使用 R0-R15 的特殊指令情況下除外。Rn<a-b> 表示其內容必須落在 a <= contents <= b 範圍內的 ARM 暫存器。對於具有兩個暫存器引數的指令,這兩者相同是允許的。例如,無論 R0 的初始內容為何,下列指令都會將 R0 歸零(Python 中的 R0 ^= R0)。

  • eor(r0, r0)

除非另有說明,否則這些指令會影響條件旗標。

4.2. 邏輯指令

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff 亦即 Rd = Rn 的 1 補數

  • bic(Rd, Rn) Rd &= ~Rn 使用 Rn 中的遮罩對 Rd 進行位元清除

請注意使用「and_」而非「and」,因為「and」是 Python 中的保留關鍵字。

4.3. 移位與旋轉指令

  • lsl(Rd, Rn<0-31>) Rd <<= Rn

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn 邏輯右移

  • asr(Rd, Rn<1-32>) Rd >>= Rn 算術右移

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) 將 Rd 向右旋轉 Rn 個位元。

舉例來說,旋轉三個位元的運作方式如下。若 Rd 初始包含位元 b31 b30..b0,旋轉後它將包含 b2 b1 b0 b31 b30..b3

4.4. 特殊指令

這些指令不會影響條件碼。

  • clz(Rd, Rn) Rd = count_leading_zeros(Rn)

count_leading_zeros(Rn) 會返回 Rn 中第一個二進位 1 位元之前的二進位 0 位元數量。

  • rbit(Rd, Rn) Rd = bit_reverse(Rn)

bit_reverse(Rn) 會返回 Rn 經位元反轉後的內容。若 Rn 包含位元 b31 b30..b0,則 Rd 會被設定為 b0 b1 b2..b31

可藉由在執行 clz 之前先進行位元反轉,來計算尾端的零位元數量。