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 |
|
ADC Rd, Rn, Op2 |
(somma con riporto) |
SUB Rd, Rn, Op2 |
|
SBC Rd, Rn, Op2 |
|
RSB Rd, Rn, Op2 |
(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 |
(azzera i bit indicati) |
MOV Rd, Op2 |
|
MVN Rd, Op2 |
|
MUL Rd, Rm, Rs |
(32 bit bassi del prodotto) |
MLA Rd, Rm, 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
- Immediato
#n: 8 bit ruotati di un numero pari di posizioni (vedi Formato delle istruzioni e modalità di indirizzamentoModalità di indirizzamento (immediato, diretto, indiretto, a registro, indiretto a registro, con spiazzamento, relativo al PC, indicizzato e scalato, a pila) con indirizzo effettivo ed esempi; formati fissi e variabili; i formati R, I e J di MIPS e il formato a 32 bit di ARM con il calcolo dei campi.Formato delle istruzioni e modalità di indirizzamento →). Per costanti qualsiasi si usa la pseudo-istruzioneLDR r0, =0x12345678, che l'assemblatore traduce in un caricamento da una tabella di costanti, oppure la coppiaMOVW/MOVT(16 bit bassi e alti). - Registro scalato:
Rm, LSL #n(shift logico a sinistra),LSR #n(logico a destra),ASR #n(aritmetico a destra),ROR #n(rotazione); lo scorrimento può essere anche di un numero di posizioni contenuto in un registro (Rm, LSL Rs). Lo scorrimento è gratuito: avviene nello stesso ciclo, nel barrel shifter prima dell'ALU.
Moltiplicazioni per costanti senza MUL:
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, #1decrementa e imposta Z quando arriva a 0. CMP Rn, Op2calcola e aggiorna i flag senza salvare il risultato;CMNfa lo stesso con .TST Rn, Op2fa l'AND e aggiorna N e Z (verifica di bit);TEQfa lo XOR (uguaglianza).
Esempio: r0 = 0x7FFFFFFF, ADDS r1, r0, #1 → , 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.
a = (b + c) - (d - e);ADD r5, r1, r2 @ r5 = b + c
SUB r6, r3, r4 @ r6 = d - e
SUB r0, r5, r6 @ a = r5 - r6a = b * 10 + (c & 0xFF);MOV r5, #10
MUL r5, r1, r5 @ r5 = b * 10
AND r6, r2, #0xFF @ r6 = c & 0xFF
ADD r0, r5, r6Operazioni 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
Sprima di un salto condizionato che deve guardare il risultato. - Usare
LSRper dividere un numero negativo: serveASR.
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 (); SBC (); RSB (); AND, ORR, EOR; BIC ( AND NOT , azzera i bit); MOV, MVN (NOT); MUL Rd,Rm,Rs (32 bit bassi); MLA (); UMULL/SMULL (prodotto a 64 bit). MUL vuole registri, non costanti.
Secondo operando
- Immediato: 8 bit ruotati di un numero pari di posizioni (Formato delle istruzioni e modalità di indirizzamentoModalità di indirizzamento (immediato, diretto, indiretto, a registro, indiretto a registro, con spiazzamento, relativo al PC, indicizzato e scalato, a pila) con indirizzo effettivo ed esempi; formati fissi e variabili; i formati R, I e J di MIPS e il formato a 32 bit di ARM con il calcolo dei campi.Formato delle istruzioni e modalità di indirizzamento →); costanti qualsiasi con
LDR r0,=0x12345678oMOVW/MOVT. - Registro scalato:
LSL,LSR,ASR,ROR, anche per un numero in registro; gratis, nel barrel shifter prima dell'ALU. - Moltiplicazioni per costante:
ADD r0,r1,r1,LSL #2;RSB r0,r1,r1,LSL #3;MOV r0,r1,ASR #1con segno.
Flag
- Suffisso S aggiorna N, Z, C, V (
SUBS r0,r0,#1). CMP() eCMN() non salvano il risultato;TST(AND) eTEQ(XOR) aggiornano N e Z.- Esempio:
ADDS r1,r0,#1conr0 = 0x7FFFFFFF0x80000000, 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).