Assembly 8086 - contiriccardo.it

annuncio pubblicitario
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
Scarica