Programmazione in linguaggio assembly per architetture Intel 8088

Programmazione in linguaggio assembly
per architetture Intel 8088
Marco Di Felice
1 Università of Bologna
Dipartimento di Scienze dell’Informazione
Corso di Architettura degli Elaboratori
mail: [email protected]
Bologna, 11 Dicembre 2007
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Architettura dei processori Intel 8088
Microprocessore Intel della terza generazione
Progetto del 1978/1979
Address bus: 20 bit ⇒ 1 MB di memoria
Data bus: 8 bit per l’8088
Registri: 14 da 16 bit
Compatibilità del software (assembler)
8086/8088 → 80286 → 80386 → 80486 → Pentium → ...
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Organizzazione della memoria
La memoria indirizzabile è pari a 220 bytes
L’unità minima indirizzabile è 1 byte
Range di indirizzi: [00000:FFFFF]
Bus Indirizzi da 20 bit vs architettura a 16 bit
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Organizzazione della memoria
Lo spazio di memoria indirizzabile dalla CPU è suddiviso in
segmenti logici. Ogni segmento è costituito da 65.536 byte
consecutivi.
Quattro registri di segmento puntano ai quattro segmenti
correntemente attivi.
1
2
3
4
CS punta al segmento contenente le istruzioni da eseguire
DS punta al segmento contenente le variabili del programma
SS punta al segmento contenente lo stack corrente
ES punta al segmento extra, usato tipicamente per i dati
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Segmentazione della memoria
Lo spazio di memoria viene visto come un gruppo di segmenti.
Ogni segmento:
Costituisce un’unità di memoria indipendente
E’ formata da locazioni contigue di memoria
Ha un limite massimo di 64k byte
Inizia ad un indirizzo di memoria multiplo di 16
Ogni riferimento alla memoria richiede l’intervento di un registro di
segmento per la costruzione di un indirizzo fisico.
Indirizzo Effettivo:
Marco Di Felice [email protected]
<segmento::offset>
Linguaggio assembly per architetture Intel 8088
Costruzione Indirizzo Fisico
1
Si considera il registro di segmento corrispondente
2
Si concatenano 4 zero a dx, producendo un indirizzo da 20 bit
3
Si somma l’offset all’indirizzo da 20 bit
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Costruzione Indirizzo Fisico
1
Si considera il registro di segmento corrispondente
2
Si concatenano 4 zero a dx, producendo un indirizzo da 20 bit
3
Si somma l’offset all’indirizzo da 20 bit
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Segmento Stack
Area di memoria gestita con politica LIFO (Least In, First Out).
Il segmento di stack è costituito da parole di 2 byte
Lo stack cresce andando dagli indirizzi alti a quelli bassi
SS punta all’indirizzo di partenza dello stack
SP punta alla locazione in cima allo stack
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Registri del processore
Disponibili 14 registri, suddivisi in 4 gruppi funzionali
L’architettura dell’8088 manca di ortogonalità
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Registri d’uso generale
I registri di uso generale sono: AX, BX, CX, DX
AX: registro accumulatore, usato per memorizzare il risultato
dell’elaborazione e come destinazione di molte istruzioni
Esempio: MOV AX,20
BX: registro base, usato come accumulatore o come
puntatore alla memoria
Esempio: MOV AX,(BX)
CX: registro contatore, usato come contatore dei cicli
DX: registro dati, usato insieme ad AX per contenere le
istruzioni lunghe due parole (32 bit).
Tutti i registri possono essere visti come coppie di registri di 8
bit (esempio: AX=AH:AL)
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Registri puntatore ed indice
I registri puntatore sono: SP, BP, SI, DI
SP: registro puntatore alla cima dello stack. Viene
modificato automaticamente dalle operazioni sullo stack
(PUSH, POP).
BP: registro puntatore base allo stack. A differenza di SP,
punta ad una locazione qualsiasi dello stack.
SI: registro indice sorgente, usato in combinazione con BP
per riferirsi a dati sullo stack, o con BX per localizzare dati in
memoria.
DI: registro indice destinazione, usato come SI
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Registro di flag
Il registro di flag è un insieme di registri da 1 bit.
I bit sono impostati da istruzioni aritmetiche:
Z - il risultato è zero
S - il risultato è negativo (bit di segno)
V - il risultato ha causato un overflow
C - il risultato ha generato un riporto
A - riporto ausiliario (oltre il bit 3)
P - parità del risultato
Gli altri bit del registro controllano alcuni aspetti dell’attività
del processore (I= attiva gli interrupt, T= abilita il tracing,
D= operazioni su stringhe). Non tutti i bit sono utilizzati.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento (1)
Indirizzamento a registro
L’operando si trova nei registri, e non è necessario accedere alla
memoria.
Esempio. CX=5, MOV AX,CX ⇒ AX=5
Indirizzamento immediato
L’operando è contenuto nell’istruzione.
costante di 8 o 16 bit.
Il dato può essere una
Esempio. MOV AX,5 ⇒ AX=5
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento (2)
Indirizzamento diretto
L’istruzione contiene l’indirizzo dei dati nell’operando stesso.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento (3)
Indirizzamento a registro indiretto
L’indirizzo dell’operando è memorizzato in uno dei registri BX, SI o
DI.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento (4)
Indirizzamento a registro con spiazzamento
L’indirizzo si ottiene dalla somma dei registri BX, SI o DI ed una
costante.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento (5)
Indirizzamento a registro con indice
L’indirizzo si ottiene dalla somma dei registri SI o DI e BX.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento (6)
Indirizzamento a registro con indice e spiazzamento
L’indirizzo si ottiene dalla somma dei registri SI o DI, BX ed una
costante.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Modalità di indirizzamento: Riepilogo
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Istruzioni di trasferimento, copia ed aritmetica
e
indirizzo effettivo, r
operando immediato
Marco Di Felice [email protected]
registro del processore, #
Linguaggio assembly per architetture Intel 8088
Principali istruzioni per il trasferimento dati: MOV
MOV: Trasferisce un byte o una word da una sorgente ad una destinazione senza alterare il contenuto della sorgente.
Indirizzamento:
registro ← indirizzo effettivo (Es. MOV AX,(200))
indirizzo effettivo ← registro (Es. MOV (BX), AX)
indirizzo effettivo ← dato immediato (Es. MOV AX,100)
Vincoli:
Non è possibile caricare un valore immediato in un registro
segmento
Il registro CS non è utilizzabile come destinazione di
un’istruzione MOV.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Operazioni sullo stack: PUSH e POP
PUSH e POP aggiungono/rimuovono un elemento dalla cima dello
stack selezionato da SS:SP.
Le operazioni sullo stack modificano il valore di SP:
L’operazione di PUSH decrementa SP di 2 byte
L’operazione di POP incrementa SP di 2 byte
Operandi validi:
PUSH: operando immediato o indirizzo effettivo (es. PUSH 30
oppure PUSH AX)
POP: indirizzo effettivo (es POP AX)
Le operazioni PUSHF e POPF trasferiscono il contenuto del
registro flag nella cima dello stack e viceversa.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Principali Operazioni aritmetiche (1)
ADD: somma l’operando sorgente all’operando destinazione e memorizza il risultato nell’operando destinazione.
Indirizzamento:
registro ← indirizzo effettivo (Es. ADD AX,(200))
indirizzo effettivo ← registro (Es. ADD BX, AX)
indirizzo effettivo ← dato immediato (Es. ADD AX,100)
L’istruzione ADD modifica i bit del registro di flag.
ADDC comprende nella somma il flag del riporto.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Principali Operazioni aritmetiche (2)
SUB: sottrae l’operando sorgente all’operando destinazione e memorizza il risultato nell’operando destinazione.
Indirizzamento:
registro ← indirizzo effettivo (Es. SUB AX,(200))
indirizzo effettivo ← registro (Es. SUB (BX), AX)
indirizzo effettivo ← dato immediato (Es. SUB AX,100)
L’istruzione SUB modifica i bit del registro di flag.
SUBC comprende nella sottrazione il flag del riporto.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Principali Operazioni aritmetiche (3)
(I)MUL: moltiplica due operandi con/senza segno.
E’un’operazione unaria: MUL source
Il primo operando è sempre il registro accumulatore (AL per
moltiplicazione tra byte, AX per word).
Il secondo operando è specificato da source e puo’ essere un
qualsiasi indirizzo effettivo.
Il risultato è posto in AX se in moltiplicano byte, in AX:DX se
si moltiplicano word.
IMUL effettua la moltiplicazione con segno.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Principali Operazioni aritmetiche (4)
(I)DIV: divide due operandi con/senza segno.
E’un’operazione unaria: DIV source
Il divisore è specificato da source e puo’ essere un qualsiasi
indirizzo effettivo.
Se source ha dimensioni di 1 byte:
1
2
Il dividendo (implicito) è AX
Il risultato della divisione è in AL, il resto in AH
Se source ha dimensioni di 1 word:
1
2
Il dividendo (implicito) è DX:AX
Il risultato della divisione è in AX, il resto in DX
IDIV effettua la divisione con segno.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Operazioni logiche, su bit e scorrimento
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Operazioni logiche, su bit e di scorrimento
1
Principali Operazioni logiche:
NEG(B), NOT(B), INC(B), DEC(B)
L’operando è un indirizzo effettivo.
2
Principali Operazioni su bit:
AND, OR, XOR
registro ← indirizzo effettivo (Es. AND AX,(200))
indirizzo effettivo ← registro (Es. AND BX, AX)
indirizzo effettivo ← dato immediato (Es. AND AX,1)
3
Principali Operazioni di scorrimento:
SHR, SHL, ROL, ROR
L’operando è contenuto nel registro CL.
La destinazione è un indirizzo effettivo.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Istruzioni di salto e di chiamata
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Istruzioni per il trasferimento del controllo (1)
JUMP: trasferisce il controllo all’istruzione specificata dall’operando
in maniera incondizionata.
Due tipi di salto:
Salto Corto: la destinazione si trova nel segmento di codice
corrente (cui fa riferimento il registro CS)
Salto Lungo: l’istruzione modifica il contenuto del registro CS
Esempio:
1:
JMP label
2:
ADD AX,BX
3:
label:
4:
AND AX,BX
N.B. La prossima istruzione ad essere eseguita è la AND!
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Istruzioni per il trasferimento del controllo (2)
CMP: Effettua una sottrazione fra due operandi senza modificare
nessuno dei due operandi.
Esempio: CMP operando1 operando2
Il risultato della sottrazione viene scartato.
I bit del registro di flag vengono modificati.
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Istruzioni di salto condizionato
Jxx: istruzioni di salto in base ai valori del registro di flag.
Le istruzioni di salto condizionato controllano se una certa
condizione è verificata. La condizione è specificata dal valore dei
registri di flag. Azioni:
Se la condizione è verificata, il controllo passa all’ istruzione il
cui indirizzo è specificato come operando
Se la condizione non è verificata, l’esecuzione prosegue con
l’istruzione successiva.
Vincoli:
Jxx consente salti di lunghezza massima pari a 128 byte
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Condizioni per istruzioni di salto
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088
Implementazione If...then..Else/ While ... Do
If (a> b) then
a=b;
else
b=a;
while (a>1000)
...
...
end while;
CMP AX,BX
JG else label
MOV AX,BX
JMP end label
else label:
MOV BX,AX
end label:
whileSum:
CMP AX,1000
JNL end while
...
JMP whileSum
end while:
Marco Di Felice [email protected]
Linguaggio assembly per architetture Intel 8088