4. Istruzioni logiche e bit a bit

4.1. Convenzioni del documento

Notazione: Rd, Rn indicano i registri ARM R0-R7, tranne nel caso delle istruzioni speciali, dove possono essere usati R0-R15. Rn<a-b> indica un registro ARM il cui contenuto deve trovarsi nell’intervallo a <= contents <= b. Nel caso di istruzioni con due argomenti di registro, è ammesso che essi siano identici. Ad esempio, il seguente azzererà R0 (in Python R0 ^= R0) indipendentemente dal suo contenuto iniziale.

  • eor(r0, r0)

Queste istruzioni influenzano i flag di condizione, tranne dove indicato.

4.2. Istruzioni logiche

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff ovvero Rd = complemento a 1 di Rn

  • bic(Rd, Rn) Rd &= ~Rn azzera i bit di Rd usando la maschera in Rn

Si noti l’uso di «and_» anziché «and», perché «and» è una parola chiave riservata in Python.

4.3. Istruzioni di scorrimento e rotazione

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Scorrimento logico a destra

  • asr(Rd, Rn<1-32>) Rd >>= Rn scorrimento aritmetico a destra

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd viene ruotato a destra di Rn bit.

Una rotazione di (ad esempio) tre bit funziona come segue. Se Rd contiene inizialmente i bit b31 b30..b0, dopo la rotazione conterrà b2 b1 b0 b31 b30..b3

4.4. Istruzioni speciali

I codici di condizione non sono influenzati da queste istruzioni.

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

count_leading_zeros(Rn) restituisce il numero di bit binari a zero prima del primo bit binario a uno in Rn.

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

bit_reverse(Rn) restituisce il contenuto di Rn con i bit invertiti. Se Rn contiene i bit b31 b30..b0, Rd verrà impostato a b0 b1 b2..b31

Gli zeri finali possono essere contati eseguendo un’inversione dei bit prima di eseguire clz.