Elementi di Assembly 8086 · 2019. 1. 6. · R. Napolitano - M. Esposito Settembre 2007 2 Assembly...
Transcript of Elementi di Assembly 8086 · 2019. 1. 6. · R. Napolitano - M. Esposito Settembre 2007 2 Assembly...
R. Napolitano - M. Esposito Settembre 2007
1
Elementi di Assembly 8086
I.T.I. “A. RIGHI e VIII” – NapoliSpecializzazione Informatica Tradizionale
Corso D – Materia: Sistemi
R. Napolitano - M. Esposito Settembre 2007
2
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
3
Assembly 8086 – I registri
DEFINIZIONEI 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
4
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
5
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
6
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
7
Assembly 8086 – I registri
I Registri dell’8086
R. Napolitano - M. Esposito Settembre 2007
8
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
9
Assembly 8086 – I registri
REGISTRI
GENERALI
R. Napolitano - M. Esposito Settembre 2007
10
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
11
Assembly 8086 – I registri
R. Napolitano - M. Esposito Settembre 2007
12
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
13
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 risultatodelle istruzioni aritmetico logiche
- 3 bit sono flag di controllo, controllabili da programma con opportune istruzioni dedicate
R. Napolitano - M. Esposito Settembre 2007
14
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
15
Assembly 8086 – I registri
FLAG DI STATO
CF (Carry Flag) = 1 se una somma/sottrazione haprodotto riporto/prestito
PF (Parità Flag) = 1 se il risultato di un’operazionecontiene un numero pari di 1
AF (Auxiliary Flag, flag di riporto ausiliario), usatonell’aritmetica BCD
ZF (Zero Flag) = 1 se un’operazione ha datorisultato nullo
SF (Sign Flag) = al bit più significativo (e cioè alsegno) dell’ultima operazione 0: positivo, 1:negativo)
OF (Overflow Flag) = 1 se l’operazione haprodotto overflow
R. Napolitano - M. Esposito Settembre 2007
16
Assembly 8086 – I registri
FLAG DI CONTROLLO
TF (Trap Flag) se = 1 permette l’esecuzione passo-passo di un programma
IF (Interrupt Flag) se = 0 permette di disabilitare leinterruzioni provenienti dalle periferiche
DF (Direction Flag) utilizzata nella gestione dellestringhe per stabilire se DI o SI devono essereincrementati (DF=0) o decrementati (DF=1).
R. Napolitano - M. Esposito Settembre 2007
17
Un calcolatore è capace di elaborare informazioni in base ad unaserie di istruzioni. fornitegli dall’utente.Tali istruzioni scritte in codice binario sono direttamenteinterpretabili dall’Unità Centrale e rappresentano il cosiddettoprogramma 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.
IL LINGUAGGIO MACCHINA E L’ASSEMBLY
R. Napolitano - M. Esposito Settembre 2007
18
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
19
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
20
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
21
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 suisingoli bit
- istruzioni per modificare la sequenza di esecuzione di unprogramma
R. Napolitano - M. Esposito Settembre 2007
22
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
23
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 cuiformato è:
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
24
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
25
Assembly 8086 – Le istruzioni di base trasferimento dati
ISTRUZIONE MOV – Schema riassuntivo
R. Napolitano - M. Esposito Settembre 2007
26
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
27
Assembly 8086 –Operazioni Aritmetiche
AddizioneADD
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
28
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
29
Assembly 8086 –Operazioni Aritmetiche
Esempio di addizione e contenuto del registro dei flagdopo l’esecuzione del programma.
R. Napolitano - M. Esposito Settembre 2007
30
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
31
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
32
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 sempreimplicitamente 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
33
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=00CF=1 e OF=1 in tutti gli altri casi (AH≠00)Gli altri bit sono indefiniti
R. Napolitano - M. Esposito Settembre 2007
34
Assembly 8086 – Operazioni Aritmetiche
Esempio di operazione MUL Con Sorgente di tipo Byte
R. Napolitano - M. Esposito Settembre 2007
35
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=0000CF=1 e OF=1 in tutti gli altri casi (DX≠0000)Gli altri bit sono indefiniti
R. Napolitano - M. Esposito Settembre 2007
36
Assembly 8086 – Operazioni Aritmetiche
Esempio di operazione MUL con Sorgente di tipo WORD
R. Napolitano - M. Esposito Settembre 2007
37
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
38
Assembly 8086 – Operazioni Aritmetiche
In questo caso CF e OF sono uguali a 1poiché in AH ci sono cifre significative del risultato
R. Napolitano - M. Esposito Settembre 2007
39
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
40
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 / divisoreDX:= 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
41
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
42
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
43
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
44
Assembly 8086 – Operazioni Aritmetiche
Incremento e decrementoINC 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 sorgenteDEC sorgenteDove 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, AN.B: Il flag C non è definito.
R. Napolitano - M. Esposito Settembre 2007
45
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 lefunzionalità del microprocessore 8086, prevede l’uso di due soli tipi di variabili: byte e word.
R. Napolitano - M. Esposito Settembre 2007
46
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
47
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
48
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
49
Assembly 8086 – Istruzioni di salto
. SALTI INCONDIZIONATIVengono 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, 3hJMP dopomov bx, 5hdopo: mov ax, 8h
R. Napolitano - M. Esposito Settembre 2007
50
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
51
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
52
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
53
Assembly 8086 – Istruzioni di salto
.
Ci sono poi altre istruzioni basate sugli stessi flag, ma più facili da ricordare:
JE salta se op1= op2 (equivalente a JZ)JNE salta se op1≠ op2 (equivalente a JNZ)
R. Napolitano - M. Esposito Settembre 2007
54
Assembly 8086 – Istruzioni di salto
.
Per il confronto tra numeri con segno:
JL o JNGE salta se op1 < op2 (salta se il flag di segno è a 1)
JG o JNLE salta se op1 > op2 (salta se entrambi i flag di zero e di segnosono uguali 0)
JLE o JNG salta se op1 <= op2 (salta se il flag di zero è a 1 o il flag disegno è a 1)
JGE o JNL salta se op1 >= op2 (salta se il flag di segno è a 0)
R. Napolitano - M. Esposito Settembre 2007
55
Assembly 8086 – Istruzioni di salto
.
Per il confronto tra numeri senza segno o tra caratteri (B below, A above):
JB o JNAE salta se op1 < op2 (salta se il flag di carry è a 1)JA o JNBE salta se op1 > op2 (salta se entrambi i flag di carry e di
zero sono 0)JBE o JNA salta se op1 <= op2 (salta se il flag di carry è a 1 o il
flag di zero è a 1)JAE o JNB salta se op1 >= op2 (salta se il flag di carry è a 0)
R. Napolitano - M. Esposito Settembre 2007
56
Assembly 8086 – Istruzioni di salto
Esempio:
; se ah maggiore di al metti cx a 1mov al, 3hmov ah,5hCMP ah,alJG ahmaggioremov bx,1hahmaggiore: mov cx,1h
R. Napolitano - M. Esposito Settembre 2007
57
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
L’istruzione
Jcond fine…
fine:
può essere riscritta come:
JNcond istrJMP fine
Istr:...
fine:
R. Napolitano - M. Esposito Settembre 2007
58
Assembly 8086 – Istruzioni di salto
STRUTTURA CONDIZIONALERiprendendo l’esempio precedente:
; se ah maggiore di al metti cx a 1mov al, 3hmov ah,5hCMP ah,alJG ahmaggioremov bx,1hahmaggiore: mov cx,1h
è facile verificare che, nel caso in cui ah<al (es al=8) vengonomodificati sia i valori di bx che di cx.
R. Napolitano - M. Esposito Settembre 2007
59
Assembly 8086 – Istruzioni di salto
La struttura condizionale ha il seguente diagramma di flusso:
CONDIZIONEV F
ISTRUZIONI SE VERO
ISTRUZIONI SE FALSO
R. Napolitano - M. Esposito Settembre 2007
60
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
61
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 falsoJMP ENDIFTHEN:
istruzioni se veroENDIF:
R. Napolitano - M. Esposito Settembre 2007
62
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
Figura a
CO NDIZIO INE
ISTRUZIO NI SE VERO
ISTRUZIO NI SE FALSO
V
SALTO CO NDIZIO NATO
SALTOINCO NDIZIO NATO
F
R. Napolitano - M. Esposito Settembre 2007
63
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 conseguenzanegare la condizione, come in figura b
Figura b
NOT condizione
IstruzioniSe vero
Istruzioni se falso
F V
ELSE
END IF
SALTOCONDIZIONATO
SALTOINCONDIZIONATO
R. Napolitano - M. Esposito Settembre 2007
64
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
65
Assembly 8086 – Istruzioni di salto
ESEMPIDati due valori a e b calcolare il
minimo:
se a<b allora minimo=aaltrimentiminimo=bfine se
MOV al, aCMP al, bJL THENMOV ah, bMOV minimo,ahJMP ENDIFTHEN:MOV minimo,alENDIF:HLTa DB 4hb DB 7hminimo DB ?
MOV al, aCMP al, bJNL ELSEMOV minimo,alJMP ENDIFELSE:MOV ah, bMOV minimo,ah ENDIF:HLTa DB 4hb DB 7hminimo DB ?
oppure
R. Napolitano - M. Esposito Settembre 2007
66
Esempio If
Realizzare un programma che:
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)
START
In PRIMO
SECONDO
PRIMO <
SECONDO
RIS < --PRIMO * SECONDO
RIS < --PRIMO/SECONDO
END
V F
Out RIS
R. Napolitano - M. Esposito Settembre 2007
67
Esempio If
; File COM é caricato all'indirizzo CS:0100hORG 100h
mov al, primocmp al, secondojl thenmov ah,0div secondo ;elsemov ah,00hmov risultato,axJMP endifthen:MUL secondomov risultato, axENDIF:Hlt
primo DB 6hsecondo DB 9h ;rieseguire invertendo i valoririsultato DW ?
Codice
R. Napolitano - M. Esposito Settembre 2007
68
Esempio If
Corrispondenza tra il flow chart e il codice Assembly
R. Napolitano - M. Esposito Settembre 2007
69
Assembly 8086 – Ciclo While
CICLO 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:
WHILE condizione
Istruzioni
Fine WHILE
condizione
istruzioni
Inizio while
Falso
Fine while
Vero
R. Napolitano - M. Esposito Settembre 2007
70
Assembly 8086 – Ciclo While
Questa struttura può essere realizzata con le istruzioni di salto secondo lo schema:
inizio_whilese non è vera condizione salta a fine_whileistruzionisalta 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
71
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:0100hORG 100hmov al,00hinizio_ciclo:
cmp al,07hjnl fine_mentreinc aljmp inizio_ciclo
fine_mentre:hlt
R. Napolitano - M. Esposito Settembre 2007
72
Assembly 8086 – Ciclo While
Esempio 2
Inizializzare la variabile DATO con un numero naturalecalcolare la somma dei numeri da 1 a DATO usando unciclo while e memorizzare il risultato nella variabile SOMMA.
R. Napolitano - M. Esposito Settembre 2007
73
Esempio Ciclo While
#make_COM#; File COM é caricato all'indirizzo CS:0100hORG 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 SOMMAmov somma,0dmov cl,1dinizio_ciclo:
cmp cl,datojnbe fine_mentreadd somma, clinc cljmp inizio_ciclofine_mentre:
S T A R T
IND A T O
S O M M A < - - 0C O N T A T O R E < - - 1
C O N T A T O R E =
D A T O
S O M M A < - - S O M M A +C O N T A T O R E
C O N T A T O R E < - - C O N T A T O R E + 1
O u t S O M M A
E N D
F
V
R. Napolitano - M. Esposito Settembre 2007
74
Esempio Ciclo While
Corrispondenza tra il flow chart e il codice Assembly
R. Napolitano - M. Esposito Settembre 2007
75
Esempio While If
ESEMPIO 3
Calcolare quanti numeri divisibili per 3 sono compresi tra 20 e 30
START
NUMERO < -- 20DIVPER3 < -- 0
NUMERO = 30
RESTO < -- NUMERO MOD 3
RESTO = 0
DIVPER3 < -- DIVPER3 + 1
NUMERO < -- NUMERO + 1
OutDIVPER3
END
V
V
FF
R. Napolitano - M. Esposito Settembre 2007
76
Esempio While If
#make_COM#; File COM é caricato all'indirizzo
CS:0100hORG 100h
iniziomentre;Cmp numero, 30dJNBE finementre; resto= numero MOD 3mov bl,3dmov al,numeromov ah,0ddiv blmov resto,ahcmp resto,0
je thenjmp fineifthen:inc DIVPER3fineif:inc numerojmp iniziomentrefinementre:hltNUMERO DB 20dDIVPER3 DB 0RESTO DB
R. Napolitano - M. Esposito Settembre 2007
77
Esempio While If
Corrispondenza tra il flow chart e il codice Assembly
R. Napolitano - M. Esposito Settembre 2007
78
F I N E