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.