Le principali strutture di controllo utilizzate in Assembly x86 sono il salto condizionato o incondizionato e le istruzioni di ciclo a conteggio (il loop). Le istruzioni di salto condizionato vanno precedute da un’istruzione di confronto CMP , questa istruzione esegue un confronto e imposta un registro al valore vero o al valore falso. Le istruzioni di salto vanno a controllare il registro per eseguire o meno il salto.

Istruzione CMP.

Sintassi: CMP operando1, operando2

Esegue la sottrazione operando1-operando2 e imposta di seguito il registro FLAG a 0 o 1.

 

Istruzione di salto condizionato: JE, JG, JLE…

Sono tutte istruzioni di salto condizionato ed hanno tutte la stessa sintassi: JE <indirizzo>. La cpu passa ad eseguire le istruzioni specificate all’indirizzo indicato. Il salto non può eccedere la distanza 128 tra gli indirizzi.

  • JE 109
  • JG 110
  • JB 112

 

  • JE salta se operando1 = operando 2
  • JG salta se operando1 > operando 2
  • JB salta se operando1 < operando 2

Istruzione di salto incondizionato: JMP.

Sintassi: JMP indirizzo

Esegue il salto all’indirizzo specificato.

 

Istruzione LOOP.

Sintassi: LOOP indirizzo.

La cpu passa ad eseguire l’istruzione posta all’indirizzo specificato, l’indirizzo viene messo nel registro contatore CX. Loop deve essere posto alla fine del blocco di istruzioni da ripetere. Nel registro contatore CX deve essere posto il numero di iterazioni.

Esempio: programma che visualizza l’alfabeto.

La prima istruzione inserisce nel contatore CX il numero 26, in questa maniera il loop viene iterato 26 volte. La seconda istruzione inserisce il codice ASCII della lettera ‘a’, cioè la prima dell’alfabeto, che è la prima che dovrà essere visualizzata. La terza istruzione serve per chiedere l’output a schermo, in questo caso abbiamo usato l’interrupt 21 di MS DOS invece che l’interrupt 10 del BIOS, pertanto la sotto funzione da usare è la 02 (invece che 0e). L’istruzione seguente serve a incrementare il contenuto del registro DL. Infine l’istruzione loop chiede di ritornare all’indirizzo 105.

 

Utilizzando l’interruzione da BIOS “int 10h”, bisogna caricare il valore nel registro AL ed usare la sottofunzione 0E. Utilizzando quella MSDOS “int 21h” bisogna caricare il dato in DL ed usare la funzione 02.

 

Esercizio: fare un programma che aspetta un tasto in input e se esso corrisponde a 0, viene visualizzato ‘Z’ altrimenti ‘n’.

Soluzione:

La funzione 00 di ‘int 16‘ è l’input da tastiera tramite interruzione richiesta dal BIOS, il carattere in input viene memorizzato nel registro AL. CMP compara il contenuto di AL con il carattere ASCII n. 30h, JE vede se il confronto vale 0 (valori eguali) ed in tal caso salta alla riga dove si visualizza “Z”, in caso contrario ‘mov al,6e‘ carica il carattere ‘n’ che poi viene visualizzato con interrupt del BIOS (mov ah,0e + int 10) poi si salta alla fine del programma (indirizzo 0116). Le istruzioni a 0100 sono l’output (con int del BIOS) del carattere ‘Z’. Questo è il flow chart che descrive l’algoritmo:

Questo è il programma in dettaglio: