Salta al contenuto
Note per Studenti Istruzioni ARM di elaborazione dati

Istruzioni ARM di elaborazione dati

In questa pagina 5
In questa pagina 4

Forma generale: OP{cond}{S} Rd, Rn, Operando2. Lavorano solo su registri e costanti (vedi L'architettura ARMARM a 32 bit come caso di studio: registri r0-r15 con SP, LR e PC, registro di stato CPSR con flag NZCV, modi del processore, architettura load/store, istruzioni condizionate, secondo operando flessibile, Thumb; differenze principali con ARMv8 a 64 bit.L'architettura ARM →).

Aritmetiche e logiche

Istruzione Effetto
ADD Rd, Rn, Op2 Rd=Rn+Op2Rd = Rn + Op2
ADC Rd, Rn, Op2 Rd=Rn+Op2+CRd = Rn + Op2 + C (somma con riporto)
SUB Rd, Rn, Op2 Rd=Rn−Op2Rd = Rn - Op2
SBC Rd, Rn, Op2 Rd=Rn−Op2−C‾Rd = Rn - Op2 - \overline{C}
RSB Rd, Rn, Op2 Rd=Op2−RnRd = Op2 - Rn (sottrazione inversa)
AND Rd, Rn, Op2 AND bit a bit
ORR Rd, Rn, Op2 OR bit a bit
EOR Rd, Rn, Op2 XOR bit a bit
BIC Rd, Rn, Op2 Rd=Rn AND NOT Op2Rd = Rn \text{ AND NOT } Op2 (azzera i bit indicati)
MOV Rd, Op2 Rd=Op2Rd = Op2
MVN Rd, Op2 Rd=NOT Op2Rd = \text{NOT } Op2
MUL Rd, Rm, Rs Rd=Rm⋅RsRd = Rm \cdot Rs (32 bit bassi del prodotto)
MLA Rd, Rm, Rs, Rn Rd=Rm⋅Rs+RnRd = Rm \cdot Rs + Rn

UMULL/SMULL RdLo, RdHi, Rm, Rs danno il prodotto completo a 64 bit senza segno / con segno. La moltiplicazione non accetta costanti: gli operandi sono registri.

Secondo operando

Moltiplicazioni per costanti senza MUL:

armasm
ADD r0, r1, r1, LSL #2      @ r0 = r1 + 4*r1 = 5*r1
RSB r0, r1, r1, LSL #3      @ r0 = 8*r1 - r1 = 7*r1
MOV r0, r1, ASR #1          @ r0 = r1 / 2 arrotondato verso -infinito (con segno)

Flag

  • Con il suffisso S l'istruzione aggiorna N, Z, C, V: SUBS r0, r0, #1 decrementa e imposta Z quando arriva a 0.
  • CMP Rn, Op2 calcola Rn−Op2Rn - Op2 e aggiorna i flag senza salvare il risultato; CMN fa lo stesso con Rn+Op2Rn + Op2.
  • TST Rn, Op2 fa l'AND e aggiorna N e Z (verifica di bit); TEQ fa lo XOR (uguaglianza).

Esempio: r0 = 0x7FFFFFFF, ADDS r1, r0, #1 → r1=0x80000000r1 = \text{0x80000000}, N = 1, Z = 0, C = 0 (nessun riporto senza segno), V = 1 (due positivi danno un negativo).

Traduzione di espressioni

Variabili a–e in r0–r4.

c
a = (b + c) - (d - e);
armasm
ADD r5, r1, r2          @ r5 = b + c
SUB r6, r3, r4          @ r6 = d - e
SUB r0, r5, r6          @ a = r5 - r6
c
a = b * 10 + (c & 0xFF);
armasm
MOV r5, #10
MUL r5, r1, r5          @ r5 = b * 10
AND r6, r2, #0xFF       @ r6 = c & 0xFF
ADD r0, r5, r6

Operazioni sui bit: impostare il bit 3 di r0 → ORR r0, r0, #8; azzerarlo → BIC r0, r0, #8; invertirlo → EOR r0, r0, #8; estrarre il byte 1 → AND r1, r0, #0xFF00 poi MOV r1, r1, LSR #8.

Errori tipici

  • Scrivere MUL r0, r1, #10: la moltiplicazione vuole registri.
  • Dimenticare la S prima di un salto condizionato che deve guardare il risultato.
  • Usare LSR per dividere un numero negativo: serve ASR.

Versione ripasso

Forma: OP{cond}{S} Rd, Rn, Operando2, solo su registri e costanti (L'architettura ARMARM a 32 bit come caso di studio: registri r0-r15 con SP, LR e PC, registro di stato CPSR con flag NZCV, modi del processore, architettura load/store, istruzioni condizionate, secondo operando flessibile, Thumb; differenze principali con ARMv8 a 64 bit.L'architettura ARM →).

Istruzioni

ADD, SUB; ADC (Rn+Op2+CRn + Op2 + C); SBC (Rn−Op2−C‾Rn - Op2 - \overline{C}); RSB (Op2−RnOp2 - Rn); AND, ORR, EOR; BIC (RnRn AND NOT Op2Op2, azzera i bit); MOV, MVN (NOT); MUL Rd,Rm,Rs (32 bit bassi); MLA (Rm⋅Rs+RnRm \cdot Rs + Rn); UMULL/SMULL (prodotto a 64 bit). MUL vuole registri, non costanti.

Secondo operando

Flag

  • Suffisso S aggiorna N, Z, C, V (SUBS r0,r0,#1).
  • CMP (Rn−Op2Rn - Op2) e CMN (Rn+Op2Rn + Op2) non salvano il risultato; TST (AND) e TEQ (XOR) aggiornano N e Z.
  • Esempio: ADDS r1,r0,#1 con r0 = 0x7FFFFFFF →\to 0x80000000, N = 1, Z = 0, C = 0, V = 1.

Traduzione di espressioni

a = (b + c) - (d - e): ADD r5,r1,r2; SUB r6,r3,r4; SUB r0,r5,r6. a = b*10 + (c & 0xFF): MOV r5,#10; MUL r5,r1,r5; AND r6,r2,#0xFF; ADD r0,r5,r6. Bit 3 di r0: impostare ORR r0,r0,#8; azzerare BIC r0,r0,#8; invertire EOR r0,r0,#8.

Errori tipici: MUL r0,r1,#10 (servono registri); dimenticare S prima di un salto condizionato; LSR su un negativo (serve ASR).

Esercizi su questo argomento

Teoria collegata