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