Strutture di controllo in assembly ARM
In questa pagina 6
Salti e condizioni
B etichetta: salto incondizionato (relativo al PC, ±32 MB).B{cond} etichetta: salta solo se la condizione sui flag è vera. I flag si impostano conCMPo con un'istruzione con suffissoS(vedi Istruzioni ARM di elaborazione datiIstruzioni aritmetiche (ADD, SUB, RSB, ADC), logiche (AND, ORR, EOR, BIC, MVN), di spostamento (MOV), moltiplicazione (MUL, MLA); secondo operando immediato o registro scalato con LSL, LSR, ASR, ROR; aggiornamento dei flag con S, CMP e TST; esempi di traduzione di espressioni C.Istruzioni ARM di elaborazione dati →).
| Suffisso | Significato | Flag | Tipo |
|---|---|---|---|
EQ / NE |
uguale / diverso | Z = 1 / Z = 0 | entrambi |
GT / GE |
maggiore / maggiore o uguale | Z = 0 e N = V / N = V | con segno |
LT / LE |
minore / minore o uguale | N ≠ V / Z = 1 o N ≠ V | con segno |
HI / HS (= CS) |
maggiore / maggiore o uguale | C = 1 e Z = 0 / C = 1 | senza segno |
LO (= CC) / LS |
minore / minore o uguale | C = 0 / C = 0 o Z = 1 | senza segno |
MI / PL |
negativo / positivo o zero | N = 1 / N = 0 | |
VS / VC |
overflow / niente overflow | V = 1 / V = 0 |
Perché servono due famiglie: con r0 = 0xFFFFFFFF e r1 = 1, CMP r0, r1 → con segno (LT vera), senza segno (HI vera). Vedi Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →.
if e if-else
if (a == b) c = c + 1; else c = c - 1; // a, b, c in r0, r1, r2 CMP r0, r1
BNE altrimenti @ condizione negata: salta al ramo else
ADD r2, r2, #1
B fine
altrimenti:
SUB r2, r2, #1
fine:Stessa cosa senza salti, con l'esecuzione condizionata:
CMP r0, r1
ADDEQ r2, r2, #1
SUBNE r2, r2, #1Conviene per rami di poche istruzioni: niente salti, quindi niente svuotamento della PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →.
Cicli
while (while (i < n) { s += i; i++; }, i, n, s in r0, r1, r2, con segno):
ciclo: CMP r0, r1
BGE fuori @ esce se i >= n
ADD r2, r2, r0
ADD r0, r0, #1
B ciclo
fuori:for con contatore all'indietro: for (i = 10; i != 0; i--) s += i; diventa
MOV r0, #10
MOV r2, #0
ciclo: ADD r2, r2, r0
SUBS r0, r0, #1 @ decrementa e aggiorna Z
BNE cicloAlla fine r2 = 10 + 9 + … + 1 = 55. Contare verso zero risparmia il CMP.
do-while: il test va in fondo, come nell'esempio precedente.
Massimo di due numeri, valore assoluto
CMP r0, r1
MOVLT r0, r1 @ r0 = max(r0, r1) con segno
CMP r0, #0
RSBLT r0, r0, #0 @ r0 = |r0|switch con tabella di salto
Se i casi sono 0, 1, …, si usa una tabella di indirizzi:
CMP r0, #3
BHS default @ senza segno: copre anche r0 < 0
ADR r1, tabella
LDR pc, [r1, r0, LSL #2] @ salta a tabella[r0]
tabella:
.word caso0, caso1, caso2Errori tipici
- Usare
BGT/BLTper confrontare indirizzi ounsigned: servonoBHI/BLO. - Dimenticare il
B finealla fine del ramo "then": si esegue anche il ramo "else". - Mettere un'istruzione con
Stra ilCMPe il salto: i flag vengono sovrascritti.
Versione ripasso
Condizioni
B incondizionato; B{cond} se i flag (da CMP o suffisso S, Istruzioni ARM di elaborazione datiIstruzioni aritmetiche (ADD, SUB, RSB, ADC), logiche (AND, ORR, EOR, BIC, MVN), di spostamento (MOV), moltiplicazione (MUL, MLA); secondo operando immediato o registro scalato con LSL, LSR, ASR, ROR; aggiornamento dei flag con S, CMP e TST; esempi di traduzione di espressioni C.Istruzioni ARM di elaborazione dati →) soddisfano la condizione.
EQ/NE: Z = 1 / 0. Con segno:GT(Z = 0 e N = V),GE(N = V),LT(N V),LE(Z = 1 o N V). Senza segno:HI(C = 1 e Z = 0),HS(C = 1),LO(C = 0),LS(C = 0 o Z = 1).MI/PL(N),VS/VC(V).- Con
r0 = 0xFFFFFFFF,r1 = 1:LTvera (con segno ) eHIvera (senza segno) (Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →).
Costrutti
- if-else (
if (a == b) c++; else c--;):CMP r0,r1;BNE altrimenti;ADD r2,r2,#1;B fine;altrimenti: SUB r2,r2,#1. Senza salti:ADDEQ r2,r2,#1;SUBNE r2,r2,#1(niente svuotamento della PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →). - while:
CMP r0,r1;BGE fuori; corpo;B ciclo. - for all'indietro
i = 10 ... 1:SUBS r0,r0,#1;BNE ciclo(nienteCMP);r2 = 10 + 9 + ... + 1 = 55. - Massimo
CMP r0,r1;MOVLT r0,r1. AssolutoCMP r0,#0;RSBLT r0,r0,#0. - switch:
CMP r0,#3;BHS default;ADR r1,tabella;LDR pc,[r1,r0,LSL #2];.word caso0, caso1, caso2.
Errori tipici: BGT/BLT per indirizzi o unsigned (servono BHI/BLO); dimenticare B fine nel ramo then; S tra CMP e salto sovrascrive i flag.