Salta al contenuto
Note per Studenti Strutture di controllo in assembly ARM

Strutture di controllo in assembly ARM

In questa pagina 6

Salti e condizioni

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 −1<1-1 < 1 (LT vera), senza segno 4 294 967 295>14\,294\,967\,295 > 1 (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

c
if (a == b) c = c + 1; else c = c - 1;      // a, b, c in r0, r1, r2
armasm
        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:

armasm
        CMP   r0, r1
        ADDEQ r2, r2, #1
        SUBNE r2, r2, #1

Conviene 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):

armasm
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

armasm
        MOV  r0, #10
        MOV  r2, #0
ciclo:  ADD  r2, r2, r0
        SUBS r0, r0, #1         @ decrementa e aggiorna Z
        BNE  ciclo

Alla 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

armasm
        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, …, k−1k-1 si usa una tabella di indirizzi:

armasm
        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, caso2

Errori tipici

  • Usare BGT/BLT per confrontare indirizzi o unsigned: servono BHI/BLO.
  • Dimenticare il B fine alla fine del ramo "then": si esegue anche il ramo "else".
  • Mettere un'istruzione con S tra il CMP e 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.

Costrutti

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.

Esercizi su questo argomento

Teoria collegata