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 &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(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 <<= Rnlsr(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 之前先進行位元反轉,來計算尾端的零位元數量。