4. Instrucțiuni logice și pe biți

4.1. Convenții ale documentului

Notație: Rd, Rn denotă registrele ARM R0-R7, cu excepția instrucțiunilor speciale unde pot fi folosite R0-R15. Rn<a-b> denotă un registru ARM al cărui conținut trebuie să se afle în intervalul a <= contents <= b. În cazul instrucțiunilor cu două argumente registru, este permis ca acestea să fie identice. De exemplu, următoarea instrucțiune va aduce la zero R0 (în Python R0 ^= R0), indiferent de conținutul său inițial.

  • eor(r0, r0)

Aceste instrucțiuni afectează indicatorii de condiție, cu excepția cazurilor menționate.

4.2. Instrucțiuni logice

  • and_(Rd, Rn) Rd &= Rn

  • orr(Rd, Rn) Rd |= Rn

  • eor(Rd, Rn) Rd ^= Rn

  • mvn(Rd, Rn) Rd = Rn ^ 0xffffffff adică Rd = complementul față de 1 al lui Rn

  • bic(Rd, Rn) Rd &= ~Rn șterge biții lui Rd folosind masca din Rn

Rețineți utilizarea lui „and_” în loc de „and”, deoarece „and” este un cuvânt cheie rezervat în Python.

4.3. Instrucțiuni de deplasare și rotație

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

  • lsr(Rd, Rn<1-32>) Rd = (Rd & 0xffffffff) >> Rn Deplasare logică la dreapta

  • asr(Rd, Rn<1-32>) Rd >>= Rn deplasare aritmetică la dreapta

  • ror(Rd, Rn<1-31>) Rd = rotate_right(Rd, Rn) Rd este rotit la dreapta cu Rn biți.

O rotație cu (de exemplu) trei biți funcționează după cum urmează. Dacă Rd conține inițial biții b31 b30..b0, după rotație va conține b2 b1 b0 b31 b30..b3

4.4. Instrucțiuni speciale

Codurile de condiție nu sunt afectate de aceste instrucțiuni.

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

count_leading_zeros(Rn) returnează numărul de biți binari zero dinaintea primului bit binar de unu din Rn.

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

bit_reverse(Rn) returnează conținutul lui Rn cu biții inversați. Dacă Rn conține biții b31 b30..b0, Rd va fi setat la b0 b1 b2..b31

Biții zero de la coadă pot fi numărați efectuând o inversare a biților înainte de a executa clz.