I.T.I. “A. RIGHI e VIII” – Napoli Specializzazione Informatica Tradizionale Corso D – Materia: Sistemi Elementi di Assembly 8086 R. Napolitano - M. Esposito Settembre 2007 1 Assembly 8086 – I registri Per poter elaborare le informazioni ricevute dall’esterno, un Processore ha bisogno di memorizzare gli “operandi” temporaneamente in locazioni di memoria in attesa di poter operare su di essi per eseguire le operazioni richieste. R. Napolitano - M. Esposito Settembre 2007 2 Assembly 8086 – I registri DEFINIZIONE I Registri sono locazioni di memoria ultraveloci (hanno la velocità del clock) in stretto contatto con tutte le altre parti della CPU a cui appartengono, con le quali interagiscono al fine di elaborare i dati pervenuti, e organizzare il loro smistamento R. Napolitano - M. Esposito Settembre 2007 3 Assembly 8086 – I registri I registri sono di norma specializzati, cioè sono in grado di compiere al meglio determinate operazioni anziché altre; usare un registro diverso da quello specializzato non vanifica l’operazione desiderata, ma la rende meno efficiente e più costosa (in termini di tempo di esecuzione e di spazio necessario nella memoria di programma). R. Napolitano - M. Esposito Settembre 2007 4 Assembly 8086 – I registri Il numero e la dimensione dei registri si sono evoluti con la storia dei processori, come anche la disponibilità di nuove istruzioni (dal 386 al Pentium IV i registri sono a 32 bit). In ogni caso i vecchi registri a 16 bit sono ancora riconosciuti e utilizzati nella programmazione. R. Napolitano - M. Esposito Settembre 2007 5 Assembly 8086 – I registri Nell’8086 il programmatore ha accesso a 14 registri a 16 bit - 4 registri generali - 4 registri segmento - 4 registri puntatori o indice - 2 registri di controllo • contatore di programma • registro di flag R. Napolitano - M. Esposito Settembre 2007 6 Assembly 8086 – I registri I Registri dell’8086 R. Napolitano - M. Esposito Settembre 2007 7 Assembly 8086 – I registri I registri generali I registri di uso generale (AX,BX,CX,DX) possono essere utilizzati così come sono definiti (cioè a 16 bit) o in due metà a 8 bit (AH – AL , BH – BL ecc.. dove H = High, ovvero parte alta e L = Low, parte bassa. Il loro impiego nell’una o nell’altra dimensione dipende dal contesto, cioè dall’istruzione che li coinvolge. R. Napolitano - M. Esposito Settembre 2007 8 Assembly 8086 – I registri R E G I S T R I G E N E R A L I R. Napolitano - M. Esposito Settembre 2007 9 Assembly 8086 – I registri Dividono la memoria in segmenti da 64kb. Vengono usati con altri registri a 16 bit per accedere a tutta la memoria disponibile. R. Napolitano - M. Esposito Settembre 2007 10 Assembly 8086 – I registri R. Napolitano - M. Esposito Settembre 2007 11 Assembly 8086 – I registri Infine troviamo il contatore di programma e il registro dei flag (flag = segnalazione) Contatore di programma IP (Instruction Pointer). Il processore “punta”, cioè contiene l’indirizzo del codice operativo dell’istruzione che sta per essere eseguita. R. Napolitano - M. Esposito Settembre 2007 12 Assembly 8086 – I registri REGISTRO DEI FLAG Questo registro ha un impiego completamente diverso da tutti gli altri. Il suo contenuto non si utilizza nella consueta forma di word, ma in funzione dei singoli bit in esso contenuti; dei 16 bit disponibili, solo 9 sono significativi, mentre i rimanenti 7 sono inutilizzati. - 6 bit sono i flag di stato, e sono influenzati dal risultato delle istruzioni aritmetico logiche - 3 bit sono flag di controllo, controllabili da programma con opportune istruzioni dedicate R. Napolitano - M. Esposito Settembre 2007 13 Assembly 8086 – I registri Il compito di questo registro è molto importante perché consente al processore di prendere decisioni. Il valore binario di un singolo flag è dunque sufficiente ad obbligare il processore ad eseguire un codice invece di un altro. Non esistono istruzioni che modificano in blocco questo registro; è in ogni caso possibile salvarne il valore nello stack o recuperarlo dallo stack. R. Napolitano - M. Esposito Settembre 2007 14 Assembly 8086 – I registri FLAG DI STATO CF (Carry Flag) = 1 se una somma/sottrazione ha prodotto riporto/prestito PF (Parità Flag) = 1 se il risultato di un’operazione contiene un numero pari di 1 AF (Auxiliary Flag, flag di riporto ausiliario), usato nell’aritmetica BCD ZF (Zero Flag) = 1 se un’operazione ha dato risultato nullo SF (Sign Flag) = al bit più significativo (e cioè al segno) dell’ultima operazione 0: positivo, 1: negativo) OF (Overflow Flag) = 1 se l’operazione ha prodotto overflow R. Napolitano - M. Esposito Settembre 2007 15 Assembly 8086 – I registri FLAG DI CONTROLLO TF (Trap Flag) se = 1 permette l’esecuzione passopasso di un programma IF (Interrupt Flag) se = 0 permette di disabilitare le interruzioni provenienti dalle periferiche DF (Direction Flag) utilizzata nella gestione delle stringhe per stabilire se DI o SI devono essere incrementati (DF=0) o decrementati (DF=1). R. Napolitano - M. Esposito Settembre 2007 16 IL LINGUAGGIO MACCHINA E L’ASSEMBLY Un calcolatore è capace di elaborare informazioni in base ad una serie di istruzioni. fornitegli dall’utente. Tali istruzioni scritte in codice binario sono direttamente interpretabili dall’Unità Centrale e rappresentano il cosiddetto programma eseguibile o programma espresso in linguaggio macchina. Risulta chiaro che tale modo di rappresentazione delle istruzioni comporta notevoli difficoltà per le persone che devono scrivere e interpretare i programmi. R. Napolitano - M. Esposito Settembre 2007 17 IL LINGUAGGIO MACCHINA E L’ASSEMBLY Per semplificare il lavoro dei programmatori è stato messo a punto di un codice più comprensibile all’uomo (codice mnemonico) che viene tradotto da un programma (assembler), nella serie corrispondente di zero e uno (codice binario) interpretabili dalla macchina. Il linguaggio nato dalla simbolizzazione mnemonica del codice macchina prende il nome di assembly. Tra il linguaggio macchina e l’assembly esiste una corrispondenza uno a uno, cosa che li rende funzionalmente equivalenti. R. Napolitano - M. Esposito Settembre 2007 18 IL LINGUAGGIO MACCHINA E L’ASSEMBLY Esiste quindi un legame molto stretto tra il linguaggio Assembly e il processore in quanto il codice operativo viene sostituito con una parola chiave (ovvero l’abbreviazione del termine inglese che definisce l’operazione da compiere), e agli indirizzi binari degli operandi vengono associati dei nomi simbolici più facilmente interpretabili dal programmatore. Pertanto è necessario realizzare un assembly diverso per ciascun tipo di processore (diversamente dai linguaggi ad alto livello, come il Pascal, dove vengono definite istruzioni standard indipendenti dalla struttura fisica dell’elaboratore). R. Napolitano - M. Esposito Settembre 2007 19 IL LINGUAGGIO MACCHINA E L’ASSEMBLY Ciò nonostante, le istruzioni di qualsiasi linguaggio Assembly possono essere raggruppate in categorie ben definite, poiché ogni calcolatore deve essere in grado di compiere determinate azioni indipendentemente dal tipo di Assembly contenuto. R. Napolitano - M. Esposito Settembre 2007 20 IL LINGUAGGIO MACCHINA E L’ASSEMBLY Qualsiasi linguaggio Assembly contiene: - istruzioni per il trasferimento dati - istruzioni per l’esecuzione di operazioni aritmetiche sui numeri interi - istruzioni per l’esecuzione di operazioni logiche sull’intero dato o sui singoli bit - istruzioni per modificare la sequenza di esecuzione di un programma R. Napolitano - M. Esposito Settembre 2007 21 IL LINGUAGGIO MACCHINA E L’ASSEMBLY Altre istruzioni invece permettono di migliorare la potenza del processore e lo rendono più adeguato per la risoluzione di determinate problematiche: - istruzioni per l’esecuzione di operazioni in virgola mobile - istruzioni per la gestione di stringhe di caratteri - istruzioni per la gestione dell’Input/Output R. Napolitano - M. Esposito Settembre 2007 22 Assembly 8086 – Le istruzioni di base trasferimento dati ISTRUZIONI DI BASE PER IL TRASFERIMENTO DI DATI: MOV l ’istruzione di base per operare il trasferimento di dati a 8 o a 16 bit è MOV, il cui formato è: MOV destinazione, sorgente ed equivale alla forma Pascal: destinazione:=sorgente destinazione può essere solo un registro o una variabile (locazione di memoria); sorgente può essere una costante, un registro o una variabile (locazione di memoria). R. Napolitano - M. Esposito Settembre 2007 23 Assembly 8086 – Le istruzioni di base trasferimento dati Inoltre sorgente e destinazione devono sottostare alle seguenti regole: - non possono riferirsi entrambe a due variabili; - devono essere fra loro compatibili in termini di dimensioni. R. Napolitano - M. Esposito Settembre 2007 24 Assembly 8086 – Le istruzioni di base trasferimento dati ISTRUZIONE MOV – Schema riassuntivo R. Napolitano - M. Esposito Settembre 2007 25 Assembly 8086 – Le istruzioni Aritmetiche All’interno del calcolatore i valori interi positivi vengono rappresentati nella loro naturale configurazione binaria, mentre quelli negativi assumono la notazione in complemento a due. Di conseguenza, anche le istruzioni che consentono di effettuare le quattro operazioni elementari tra valori interi (a 8 o a 16 bit) faranno riferimento a questo tipo di codifica e sarà compito del programmatore interpretare, di volta in volta, il risultato in maniera corretta. R. Napolitano - M. Esposito Settembre 2007 26 Assembly 8086 –Operazioni Aritmetiche Addizione ADD Il formato generale di un’istruzione aritmetica di addizione è: ADD destinazione, sorgente ed equivale alla forma Pascal: destinazione:= destinazione+sorgente dove per destinazione e sorgente vale quanto già detto per l’istruzione MOV. R. Napolitano - M. Esposito Settembre 2007 27 Assembly 8086 –Operazioni Aritmetiche In base al risultato ottenuto vengono modificati i bit di stato del registro dei flag. In particolare: SF assume il valore del bit più significativo del risultato, che ne rappresenta il segno; ZF assume il valore 0 se il risultato dell’operazione è diverso da zero, 1 se il risultato dell’operazione è 0; CF assume il valore 1 se nell’operazione si è verificato un riporto sul bit più significativo, 0 negli altri casi. R. Napolitano - M. Esposito Settembre 2007 28 Assembly 8086 –Operazioni Aritmetiche Esempio di addizione e contenuto del registro dei flag dopo l’esecuzione del programma. R. Napolitano - M. Esposito Settembre 2007 29 Assembly 8086 – Operazioni Aritmetiche Sottrazione SUB Il formato generale di un’istruzione aritmetica di sottrazione è: SUB destinazione, sorgente ed equivale alla forma Pascal: destinazione:= destinazione - sorgente dove per destinazione e sorgente vale quanto già detto per l’istruzione MOV. In base al risultato ottenuto vengono modificati i bit di stato del registro dei flag esattamente come avveniva nel caso dell’addizione. R. Napolitano - M. Esposito Settembre 2007 30 Assembly 8086 – Operazioni Aritmetiche Esempio di operazione Sub e contenuto del registro dei flag dopo l’esecuzione del programma. R. Napolitano - M. Esposito Settembre 2007 31 Assembly 8086 – Operazioni Aritmetiche Moltiplicazione Il linguaggio assembly prevede istruzioni diverse per la moltiplicazione a seconda che i fattori vengano interpretati come numeri naturali (senza segno) o come numeri relativi (con segno). MUL L’istruzione di moltiplicazione tra numeri naturali, che prevede sempre implicitamente l’uso dell’accumulatore, ha il seguente formato: MUL sorgente dove sorgente può essere un registro o una variabile (locazione di memoria). R. Napolitano - M. Esposito Settembre 2007 32 Assembly 8086 – Operazioni Aritmetiche Se sorgente è di tipo byte, il valore di sorgente viene moltiplicato per quello contenuto in AL e il risultato, calcolato su 16 bit, posto in AX. AX:= sorgente* AL Bit di flag: CF=0 e OF=0 se AH=00 CF=1 e OF=1 in tutti gli altri casi (AH≠00) Gli altri bit sono indefiniti R. Napolitano - M. Esposito Settembre 2007 33 Assembly 8086 – Operazioni Aritmetiche Esempio di operazione MUL Con Sorgente di tipo Byte R. Napolitano - M. Esposito Settembre 2007 34 Assembly 8086 – Operazioni Aritmetiche Se sorgente è di tipo word, il valore di sorgente viene moltiplicato per quello contenuto in AX e il risultato, calcolato su 32 bit, posto in DX:AX. DX:AX := sorgente* AX Bit di flag : CF=0 e OF= se DX=0000 CF=1 e OF=1 in tutti gli altri casi (DX≠0000) Gli altri bit sono indefiniti R. Napolitano - M. Esposito Settembre 2007 35 Assembly 8086 – Operazioni Aritmetiche Esempio di operazione MUL con Sorgente di tipo WORD R. Napolitano - M. Esposito Settembre 2007 36 Assembly 8086 – Operazioni Aritmetiche IMUL L’istruzione di moltiplicazione tra numeri relativi è IMUL. Opera in modo del tutto analogo a MUL, con l’unica differenza che il bit più significativo degli operandi viene considerato come bit di segno. Bit di flag : CF=0 e OF=0 solo se la parte più significativa del risultato rappresenta solo un’estensione a 16 bit del bit di segno (tutti i bit pari a 0 o a 1 e uguali al bit più significativo della parte bassa. In altre parole quando CF e OF valgono 1, indicano che AH o DX contengono cifre significative del risultato. R. Napolitano - M. Esposito Settembre 2007 37 Assembly 8086 – Operazioni Aritmetiche In questo caso CF e OF sono uguali a 1 poiché in AH ci sono cifre significative del risultato R. Napolitano - M. Esposito Settembre 2007 38 Assembly 8086 – Operazioni Aritmetiche DIV La divisione tra numeri naturali prevede la dichiarazione implicita del primo operando (il dividendo), ed ha il seguente formato: DIV divisore dove divisore può essere un registro o una variabile (locazione di memoria). se divisore è di tipo byte, viene effettuata la divisione tra il valore contenuto in AX e il valore di divisore; il quoziente viene posto in AL e il resto in AH. R. Napolitano - M. Esposito Settembre 2007 39 Assembly 8086 – Operazioni Aritmetiche AL:= AX / divisore AH:= resto della divisione I bit di flag vengono modificati dall’operazione, ma il loro valore finale è privo di ogni significato. se divisore è di tipo word, viene effettuata la divisione tra il valore contenuto nella coppia DX:AX e il valore di divisore. AX:= DX:AX / divisore DX:= resto della divisione I bit di flag vengono modificati dall’operazione, ma il loro valore finale è privo di ogni significato. R. Napolitano - M. Esposito Settembre 2007 40 Assembly 8086 – Operazioni Aritmetiche IDIV L’istruzione di divisione tra numeri relativi: IDIV divisore Opera in modo del tutto analogo alla precedente. N.B. Se il quoziente va oltre la capacità del proprio registro di destinazione (FFh per divisore di un byte, FFFFh per divisore di tipo word), e quando si tenta la divisione per zero, si genera un’interruzione di tipo 0. In questo caso il quoziente e il resto sono indefiniti. R. Napolitano - M. Esposito Settembre 2007 41 Assembly 8086 – Operazioni Aritmetiche ADC E’ un’altra istruzione di addizione che consente di tener conto, nel calcolo, del riporto proveniente dall’istruzione precedente. Il formato è: ADC destinazione, sorgente ed equivale alla forma Pascal: destinazione:= destinazione + sorgente + valore del flag di carry dove per destinazione e sorgente vale quanto già detto per l’istruzione MOV. Sono definiti tutti i 6 flag di stato come nell’istruzione ADD. R. Napolitano - M. Esposito Settembre 2007 42 Assembly 8086 – Operazioni Aritmetiche SBB E’ un’altra istruzione di sottrazione che consente di tener conto, nel calcolo, anche del riporto proveniente dall’istruzione precedente; il suo formato è: SBB destinazione, sorgente ed equivale alla forma Pascal: destinazione:= destinazione – sorgente- valore del flag di carry dove per destinazione e sorgente vale quanto già detto per l’istruzione MOV. Sono definiti tutti i 6 flag di stato come nell’istruzione SUB. R. Napolitano - M. Esposito Settembre 2007 43 Assembly 8086 – Operazioni Aritmetiche Incremento e decremento INC e DEC Oltre alle 4 operazioni aritmetiche tradizionali, il linguaggio assembly prevede delle istruzioni particolari per velocizzare le operazioni di incremento e d decremento unitario di registri e variabili. Il loro formato è: INC sorgente DEC sorgente Dove sorgente può essere il riferimento a un registro o a una variabile. Equivalgono rispettivamente alle forme Pascal: sorgente:= sorgente+ 1 sorgente:= sorgente – 1 Sono definiti i flag di stato: Z, S, O, P, A N.B: Il flag C non è definito. R. Napolitano - M. Esposito Settembre 2007 44 Assembly 8086 – Dichiarazione variabili DICHIARAZIONE DELLE VARIABILI Tutte le variabili usate nel programma, eccezione fatta per i registri che possono essere considerati come variabili predefinite, devono essere dichiarate, in modo che l’assemblatore possa allocare in memoria, in base al tipo, il numero di byte necessari per la registrazione del loro valore. Dato che il microprocessore opera solo con dati binari raggruppati in byte o parole, di 16 bit, il linguaggio assembly, che ricalca le funzionalità del microprocessore 8086, prevede l’uso di due soli tipi di variabili: byte e word. R. Napolitano - M. Esposito Settembre 2007 45 Assembly 8086 – Dichiarazione variabili DB e DW La dichiarazione di una variabile di tipo byte, per la quale vengono riservati in memoria 8 bit, viene effettuata nel modo seguente: nome della variabile DB valore mentre per il tipo word vengono riservati 16 bit, e viene effettuata nel modo seguente: nome della variabile DW valore Nel caso in cui si voglia definire una variabile priva di valore di inizializzazione, è sufficiente inserire un ? al posto del valore. N.B. Nell’emulatore EMU8086 la dichiarazione di variabili va inserita alla fine del programma, dopo l’istruzione HLT. R. Napolitano - M. Esposito Settembre 2007 46 Assembly 8086 – Dichiarazione variabili Il valore di inizializzazione deve essere compatibile con la dimensione della variabile e deve appartenere ad una delle seguenti categorie di costanti: R. Napolitano - M. Esposito Settembre 2007 47 Assembly 8086 – Istruzioni di salto . Il controllo di flusso è realizzato mediante le istruzioni di salto. Le istruzioni di salto permettono di specificare l’indirizzo dell’istruzione successiva da eseguire, in modo da modificare la normale sequenza di esecuzione. L’istruzione di destinazione può essere successiva (selezione) o precedente (iterazione) rispetto all’istruzione di salto. Le istruzioni di salto possono essere incondizionate (vengono sempre eseguite) o condizionate (vengono eseguite o meno in base al valore di determinati flag). Le istruzioni a cui si può arrivare mediante un salto possono essere individuate o mediante il loro indirizzo, o mediante un’etichetta. Un’etichetta in un programma rappresenta l’indirizzo di un’istruzione (l’assemblatore calcola l’indirizzo corrispondente all’etichetta). Le etichette sono specificate come segue: nome: N.B. in un programma non può essere assegnato a due etichette lo stesso nome. R. Napolitano - M. Esposito Settembre 2007 48 Assembly 8086 – Istruzioni di salto . SALTI INCONDIZIONATI Vengono eseguiti con l’istruzione JMP: JMP operando dove operando è l’indirizzo dell’istruzione da cui proseguire l’esecuzione (di solito è un’etichetta). L’istruzione JMP permette di fare un salto a qualsiasi altro indirizzo, anche in un segmento diverso, ma è buona regola eseguire solo salti all’interno dello stesso modulo (del programma principale o della procedura). Esempio: mov ax, 3h JMP dopo mov bx, 5h dopo: mov ax, 8h R. Napolitano - M. Esposito Settembre 2007 49 Assembly 8086 – Istruzioni di salto . SALTI CONDIZIONATI Si basano sul valore dei flag impostati dalle operazioni aritmetico-logiche e dall’istruzione CMP; se la condizione è falsa l’esecuzione continua in modo sequenziale, se la condizione è vera viene eseguito il salto. L’istruzione CMP ha il formato: CMP operando1, operando2 R. Napolitano - M. Esposito Settembre 2007 50 Assembly 8086 – Istruzioni di salto Per gli operandi valgono le stesse regole già viste per ADD e SUB. L’istruzione CMP si comporta come una sottrazione; sottrae il secondo operando dal primo, ma non modifica nessun operando, cioè trascura il risultato e l’unico effetto è quello di impostare i flag di stato in base al risultato calcolato, in modo che possano essere utilizzati correttamente da una successiva istruzione di salto condizionato. Ad ogni flag di stato (ZF,SF,OF,CF,PF) sono associate due istruzioni di salto condizionato: una che salta se il flag è a 1, l’altra (che contiene una N nel nome) che salta se il flag è a 0. R. Napolitano - M. Esposito Settembre 2007 51 Assembly 8086 – Istruzioni di salto . Il formato generale di una istruzione di salto condizionato è: J<condizione> operando Le istruzioni di salto per l'8086 sono: JZ,JNZ,JS,JNS,JO,JNO,JC,JNC,JP,JNP Es.; JZ salta se il flag Z è a 1, JNZ salta se il flag Z è a 0. R. Napolitano - M. Esposito Settembre 2007 52 Assembly 8086 – Istruzioni di salto . Ci sono poi altre istruzioni basate sugli stessi flag, ma più facili da ricordare: JE JNE salta se op1= op2 (equivalente a JZ) salta se op1≠ op2 (equivalente a JNZ) R. Napolitano - M. Esposito Settembre 2007 53 Assembly 8086 – Istruzioni di salto . Per il confronto tra numeri con segno: JL o JNGE JG o JNLE salta se op1 < op2 (salta se il flag di segno è a 1) salta se op1 > op2 (salta se entrambi i flag di zero e di segno sono uguali 0) JLE o JNG salta se op1 <= op2 (salta se il flag di zero è a 1 o il flag di segno è a 1) JGE o JNL salta se op1 >= op2 (salta se il flag di segno è a 0) R. Napolitano - M. Esposito Settembre 2007 54 Assembly 8086 – Istruzioni di salto . Per il confronto tra numeri senza segno o tra caratteri (B below, A above): JB o JNAE JA o JNBE JBE o JNA JAE o JNB salta se op1 < op2 (salta se il flag di carry è a 1) salta se op1 > op2 (salta se entrambi i flag di carry e di zero sono 0) salta se op1 <= op2 (salta se il flag di carry è a 1 o il flag di zero è a 1) salta se op1 >= op2 (salta se il flag di carry è a 0) R. Napolitano - M. Esposito Settembre 2007 55 Assembly 8086 – Istruzioni di salto Esempio: ; se ah maggiore di al metti cx a 1 mov al, 3h mov ah,5h CMP ah,al JG ahmaggiore mov bx,1h ahmaggiore: mov cx,1h R. Napolitano - M. Esposito Settembre 2007 56 Assembly 8086 – Istruzioni di salto Nel processore 8086 le istruzioni di salto condizionato richiedono che l’indirizzo di destinazione sia abbastanza vicino (tra -128 byte e 127 byte, in modo da gestire l’indirizzo con un solo byte); se si supera la distanza consentita l’assemblatore segnala un errore. Per effettuare un salto condizionato ad una distanza maggiore ci si può servire di un salto incondizionato, che non presenta questo problema R. Napolitano - M. Esposito Settembre 2007 L’istruzione Jcond fine … fine: può essere riscritta come: JNcond istr JMP fine Istr: ... fine: 57 Assembly 8086 – Istruzioni di salto STRUTTURA CONDIZIONALE Riprendendo l’esempio precedente: ; se ah maggiore di al metti cx a 1 mov al, 3h mov ah,5h CMP ah,al JG ahmaggiore mov bx,1h ahmaggiore: mov cx,1h è facile verificare che, nel caso in cui ah<al (es al=8) vengono modificati sia i valori di bx che di cx. R. Napolitano - M. Esposito Settembre 2007 58 Assembly 8086 – Istruzioni di salto La struttura condizionale ha il seguente diagramma di flusso: V ISTRUZIONI SE VERO R. Napolitano - M. Esposito Settembre 2007 CONDIZIONE F ISTRUZIONI SE FALSO 59 Assembly 8086 – Istruzioni di salto Per codificare in assembly questa struttura, le istruzioni vanno scritte in sequenza. Allora proviamo a deformare il diagramma allungando e restringendo le linee di connessione, senza però modificare i punti di giunzione. Ci sono due possibilità: mettere prima le “istruzioni se falso” e poi le “istruzioni se vero” o viceversa. R. Napolitano - M. Esposito Settembre 2007 60 Assembly 8086 – Istruzioni di salto Si può anteporre il blocco ELSE (istruzioni se falso) e posporre il blocco THEN (istruzioni se vero), infatti in assembly il salto avviene se la condizione è vera: Jcondizione THEN istruzioni se falso JMP ENDIF THEN: istruzioni se vero ENDIF: R. Napolitano - M. Esposito Settembre 2007 61 Assembly 8086 – Istruzioni di salto Si può anteporre il blocco THEN (istruzioni se vero) e posporre il blocco ELSE (istruzioni se falso), come in figura a SALTO IN C O N D IZ IO N A T O F V C O N D IZ IO IN E SALTO C O N D IZ IO N A T O IS T R U Z IO N I S E VERO IS T R U Z IO N I S E FALSO Figura a R. Napolitano - M. Esposito Settembre 2007 62 Assembly 8086 – Istruzioni di salto Poiché le istruzioni assembly sono fatte in modo da saltare quando la condizione è vera, occorre invertire Vero con Falso, e di conseguenza negare la condizione, come in figura b F NOT condizione V Istruzioni Se vero SALTO CONDIZIONATO ELSE SALTO INCONDIZIONATO Istruzioni se falso END IF Figura b R. Napolitano - M. Esposito Settembre 2007 63 Assembly 8086 – Istruzioni di salto In entrambi i casi si può notare che per implementare una struttura di controllo condizionale sono necessarie due istruzioni di salto, una condizionata e una incondizionata. R. Napolitano - M. Esposito Settembre 2007 64 Assembly 8086 – Istruzioni di salto ESEMPI Dati due valori a e b calcolare il minimo: se a<b allora minimo=a altrimenti minimo=b fine se MOV al, a oppure CMP al, b JL THEN MOV ah, b MOV minimo,ah JMP ENDIF THEN: MOV minimo,al ENDIF: HLT a DB 4h b DB 7h minimo DB ? R. Napolitano - M. Esposito Settembre 2007 MOV al, a CMP al, b JNL ELSE MOV minimo,al JMP ENDIF ELSE: MOV ah, b MOV minimo,ah ENDIF: HLT a DB 4h b DB 7h minimo DB ? 65 Esempio If START Realizzare un programma che: In PRIMO SECONDO inizializzi due dati a 8 bit in memoria; se il primo è più piccolo del secondo esegua la moltiplicazione tra i due valori; se il primo è più grande o uguale al secondo esegua la divisione tra il primo e il secondo; in ogni caso scriva il risultato in memoria (in una variabile a 16 bit da usare per tutti e due i casi) V PRIMO < SECONDO RIS < -PRIMO * SECONDO R. Napolitano - M. Esposito Settembre 2007 F RIS < -PRIMO/SECONDO Out RIS END 66 Esempio If ; File COM é caricato all'indirizzo CS:0100h ORG 100h Codice mov al, primo cmp al, secondo jl then mov ah,0 div secondo ;else mov ah,00h mov risultato,ax JMP endif then: MUL secondo mov risultato, ax ENDIF: Hlt primo DB 6h secondo DB 9h risultato DW ? ;rieseguire invertendo i valori R. Napolitano - M. Esposito Settembre 2007 67 Esempio If Corrispondenza tra il flow chart e il codice Assembly R. Napolitano - M. Esposito Settembre 2007 68 Assembly 8086 – Ciclo While CICLO WHILE Inizio while L’iterazione è una struttura che permette di ripetere più volte l’esecuzione di un’istruzione strutturata, sotto il controllo di una condizione. La tipica struttura iterativa a controllo in testa è del tipo: Falso condizione Vero WHILE condizione Istruzioni istruzioni Fine WHILE Fine while R. Napolitano - M. Esposito Settembre 2007 69 Assembly 8086 – Ciclo While Questa struttura può essere realizzata con le istruzioni di salto secondo lo schema: inizio_while se non è vera condizione salta a fine_while istruzioni salta a inizio_while fine_while La struttura assembly corrispondente risulta essere: inizio_while: CMP … JN condizione fine_while <istruzioni> JMP inizio_while fine_while <prosecuzione del programma> R. Napolitano - M. Esposito Settembre 2007 70 Assembly 8086 – Ciclo While Esempio 1 Assegnare ad AL successivamente i valori da 0 a 7, usando un ciclo while #make_COM# ; Assegnare ad AL successivamente i valori da ; 0 a 7, usando un ciclo while ; File COM é caricato all'indirizzo CS:0100h ORG 100h mov al,00h inizio_ciclo: cmp al,07h jnl fine_mentre inc al jmp inizio_ciclo fine_mentre: hlt R. Napolitano - M. Esposito Settembre 2007 71 Assembly 8086 – Ciclo While Esempio 2 Inizializzare la variabile DATO con un numero naturale calcolare la somma dei numeri da 1 a DATO usando un ciclo while e memorizzare il risultato nella variabile SOMMA. R. Napolitano - M. Esposito Settembre 2007 72 Esempio Ciclo While START #make_COM# ; File COM é caricato all'indirizzo CS:0100h ORG 100h ; Inizializzare la variabile DATO con un numero naturale ; calcolare la somma dei numeri da 1 a DATO usando un ciclo ; while e memorizzare il risultato nella variabile SOMMA mov somma,0d mov cl,1d inizio_ciclo: cmp cl,dato jnbe fine_mentre add somma, cl inc cl jmp inizio_ciclo fine_mentre: IN DATO S O M M A < -- 0 C O N T A T O R E < -- 1 CONTATORE = DATO V S O M M A < -- S O M M A + CONTATORE C O N T A T O R E < -- C O N T A T O R E + 1 R. Napolitano - M. Esposito Settembre 2007 F Out SOMMA END 73 Esempio Ciclo While Corrispondenza tra il flow chart e il codice Assembly R. Napolitano - M. Esposito Settembre 2007 74 Esempio While If START ESEMPIO 3 NUMERO < -- 20 DIVPER3 < -- 0 Calcolare quanti numeri divisibili per 3 sono compresi tra 20 e 30 NUMERO = 30 V RESTO < -- NUMERO MOD 3 RESTO = 0 V DIVPER3 < -- DIVPER3 + 1 F F NUMERO < -- NUMERO + 1 Out DIVPER3 END R. Napolitano - M. Esposito Settembre 2007 75 Esempio While If #make_COM# ; File COM é caricato all'indirizzo CS:0100h ORG 100h iniziomentre; Cmp numero, 30d JNBE finementre ; resto= numero MOD 3 mov bl,3d mov al,numero mov ah,0d div bl mov resto,ah cmp resto,0 je then jmp fineif then: inc DIVPER3 fineif: inc numero jmp iniziomentre finementre: hlt NUMERO DB 20d DIVPER3 DB 0 RESTO DB R. Napolitano - M. Esposito Settembre 2007 76 Esempio While If Corrispondenza tra il flow chart e il codice Assembly R. Napolitano - M. Esposito Settembre 2007 77 FINE R. Napolitano - M. Esposito Settembre 2007 78