microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome al...

64
Microprocessori x86-16 « «a2» 2013.11.11 --- Copyright Daniele Giacomini -- [email protected] http://informaticalibera.net Segmenti ............................................ 2941 Registri ................... 2943 Trasferimento di dati tra due segmenti differenti ........... 2947 Riferimenti a indirizzi di memoria con i registri ............ 2948 Convenzioni di chiamata ................................ 2950 Sintesi delle istruzioni x86-16 ........................... 2951 Sostituzione delle istruzioni per i186 ..................... 2998 Riferimenti ............................................ 3000 ADC 2970 ADD 2970 AH 2943 AL 2943 AND 2973 AX 2943 BH 2943 BL 2943 BP 2943 BX 2943 CALL 2977 CALL FAR 2977 CBW 2952 CH 2943 CL 2943 CLC 2986 CLD 2986 CLI 2983 CMC 2986 CMP 2986 CMPSB 2964 CMPSW 2964 CWD 2952 CX 2943 DEC 2970 DH 2943 DI 2943 DIV 2970 DL 2943 DX 2943 ENTER 2977 FLAGS 2943 HLT 2983 IDIV 2970 IMUL 2970 IN 2997 2997 INC 2970 INT 2983 INTO 2983 IP 2943 IRET 2983 JA 2988 JAE 2988 JB 2988 JBE 2988 JC 2988 JCXZ 2988 JE 2988 JG 2988 JGE 2988 JL 2988 JLE 2988 JMP 2988 JMP FAR 2988 JNA 2988 JNAE 2988 JNB 2988 JNBE 2988 JNC 2988 JNE 2988 JNG 2988 JNGE 2988 JNL 2988 JNO 2988 JNP 2988 JNS 2988 JNZ 2988 JO 2988 JP 2988 JPE 2988 JPO 2988 JS 2988 JZ 2988 LAHF 2952 LDS 2952 LEA 2952 LEAVE 2977 LES 2952 LODSB 2957 LODSW 2957 LOOP 2995 LOOPE 2995 LOOPNE 2995 LOOPNZ 2995 LOOPZ 2995 MOV 2952 MOVSB 2957 MOVSW 2957 MUL 2970 NEG 2970 NOP 2952 NOT 2973 OR 2973 OUT 2997 2939

Upload: buikhuong

Post on 19-Feb-2019

228 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Microprocessori x86-16«

«a2»

2013

.11.

11--

-Cop

yrig

ht

Dan

iele

Gia

com

ini-

-app

unti2

@gm

ail.c

omht

tp://

info

rmat

ical

iber

a.ne

t

Segmenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2941

Registri . . . . . . . . . . . . . . . . . . .2943

Trasferimento di dati tra due segmenti differenti . . . . . . . . . . . 2947

Riferimenti a indirizzi di memoria con i registri . . . . . . . . . . . .2948

Convenzioni di chiamata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2950

Sintesi delle istruzioni x86-16 . . . . . . . . . . . . . . . . . . . . . . . . . . . 2951

Sostituzione delle istruzioni per i186 . . . . . . . . . . . . . . . . . . . . . 2998

Riferimenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3000

ADC 2970 ADD 2970 AH 2943 AL 2943 AND 2973 AX 2943 BH2943 BL 2943 BP 2943 BX 2943 CALL 2977 CALL FAR 2977CBW 2952 CH 2943 CL 2943 CLC 2986 CLD 2986 CLI 2983 CMC2986 CMP 2986 CMPSB 2964 CMPSW 2964 CWD 2952 CX 2943DEC 2970 DH 2943 DI 2943 DIV 2970 DL 2943 DX 2943 ENTER2977 FLAGS 2943 HLT 2983 IDIV 2970 IMUL 2970 IN 29972997 INC 2970 INT 2983 INTO 2983 IP 2943 IRET 2983 JA2988 JAE 2988 JB 2988 JBE 2988 JC 2988 JCXZ 2988 JE 2988JG 2988 JGE 2988 JL 2988 JLE 2988 JMP 2988 JMP FAR 2988JNA 2988 JNAE 2988 JNB 2988 JNBE 2988 JNC 2988 JNE 2988JNG 2988 JNGE 2988 JNL 2988 JNO 2988 JNP 2988 JNS 2988JNZ 2988 JO 2988 JP 2988 JPE 2988 JPO 2988 JS 2988 JZ2988 LAHF 2952 LDS 2952 LEA 2952 LEAVE 2977 LES 2952LODSB 2957 LODSW 2957 LOOP 2995 LOOPE 2995 LOOPNE2995 LOOPNZ 2995 LOOPZ 2995 MOV 2952 MOVSB 2957 MOVSW2957 MUL 2970 NEG 2970 NOP 2952 NOT 2973 OR 2973 OUT 2997

2939

Page 2: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

2997 POP 2977 POPA 2977 POPF 2977 PUSH 2977 PUSHA 2977PUSHF 2977 RCL 2974 RCR 2974 REP 2957 REPE 2964 REPNE2964 REPNZ 2964 REPZ 2964 RET 2977 RETF 2977 RET FAR2977 ROL 2974 ROR 2974 SAHF 2952 SAL 2974 SAR 2974 SBB2970 SCASB 2964 SCASW 2964 SHL 2974 SHR 2974 SI 2943 SP2943 STC 2986 2986 STI 2983 STOSB 2957 STOSW 2957 SUB2970 TEST 2986 XCHG 2952 XLATB 2957 XOR 2973

I microprocessori x86-16 sono sostanzialmente costituiti dal 8086 edal 8088, con la caratteristica di gestire registri a 16 bit e di poter in-dirizzare complessivamente fino a 1024 Kibyte, suddividendo peròla memoria in segmenti da 64 Kibyte. Questa famiglia ha il limite didisporre di pochi registri per usi generali, spesso vincolati a un ruolopreciso, nell’ambito di certe istruzioni.

Dal momento che esiste una grande quantità di modelli di micropro-cessori compatibili con la vecchia famiglia a 16 bit e dato che sonodisponibili simulatori ed emulatori, può essere ancora interessante lostudio della programmazione a 16 bit, riferita al modello x86-16, senon si devono affrontare problematiche relative alla protezione dellamemoria e a gestioni sofisticate della stessa.

Questo e gli altri capitoli dedicati alla programmazione con i mi-croprocessori x86-16 e l’architettura dell’elaboratore IBM PC deiprimi anni 1980, si limitano ad affrontare le questioni che consento-no di lavorare con i registri di segmento posti tutti allo stesso valore(salva la possibilità di travasare dei dati da una parte della memo-ria all’altra). Molte questioni importanti non vengono affrontate e sirimanda ai riferimenti posti alla fine dei capitoli, per gli approfon-dimenti eventuali, oltre che al capitolo 64, in cui si fa riferimento aimicroprocessori x86-32.

2940

Page 3: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Segmenti«

Prima di considerare i registri di un microprocessore x86-16, è im-portante comprendere il concetto di segmento, utilizzato in questocontesto.

Dal momento che i registri sono a 16 bit, con questi si possono rap-presentare valori senza segno da zero a 65535; pertanto, dato chela memoria è organizzata in byte, con un registro si può scandiresoltanto un intervallo di 64 Kibyte. Per poter scandire lo spazio di1024 Kibyte, occorrono due registri, in modo da comporre assiemeun indirizzo da 20 bit.

Per indirizzare la memoria, a qualunque titolo, nei microprocessorix86-16 è necessario un registro di segmento e un altro valore cheesprima lo scostamento dall’inizio del segmento a cui il contesto siriferisce.

I segmenti possono collocarsi in memoria con una certa libertà, per-tanto possono sovrapporsi, parzialmente o completamente. In prati-ca la memoria viene suddivisa idealmente in paragrafi (o click) da16 byte ciascuno e i segmenti possono iniziare soltanto all’inizio diun paragrafo. Per garantire che ciò avvenga in questo modo, i registriche sono dedicati a rappresentare l’inizio di un segmento, riportanoil numero del paragrafo, ovvero l’indirizzo assoluto di memoria di-viso per 16. Questa divisione si ottiene con un semplice scorrimentoa destra di quattro bit; pertanto, per ritrovare il valore originale èsufficiente fare lo scorrimento opposto, verso sinistra. Per esempio,il valore 159D16 contenuto in un registro di segmento, individua inrealtà l’indirizzo 159D016, pari a 8852810.

Come accennato, per individuare una certa posizione in memoria si

2941

Page 4: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

usa sempre un registro di segmento e un altro valore che rappresentalo scostamento a partire dall’inizio del segmento a cui si riferisce ilcontesto. Per esempio, se il registro di segmento contiene il valore159D16 e si specifica lo scostamento FFFE16, si sta in pratica facen-do riferimento alla posizione di memoria 159D016+FFFE16, pari a259CE16, ovvero 15406210.

Stante questa organizzazione, per indicare in un documento un cer-to indirizzo di memoria, si può usare la definizione di «indiriz-zo efficace» e si può scrivere un solo numero, come per esempio159DF16.

|Riquadro u139.1. Valori affiancati e divisi dal simbolo ‘:’.Nella programmazione a 16 bit, con i microprocessori della famiglia x86,per affiancare due valori a 16 bit si usa normalmente il segno di due punti,come per esempio DX:AX o 159D16:FFFE16.In generale, questa rappresentazione indica soltanto che si vuole fare ri-ferimento a un numero a 32 bit, formato dall’unione delle due parti in-dicate, ma il significato che questo numero deve avere va interpretatoin base al contesto. Per esempio, DX:AX potrebbe essere il risultato diuna moltiplicazione, da prendere numericamente tale e quale, nel sen-so che il registro DX rappresenta i 16 bit più significativi; ma in unaltro contesto, DS:SI può fare riferimento a un indirizzo che si inter-preta come DS·16+SI. Nello stesso modo, il numero rappresentato co-me 100016:59DF16, potrebbe indicare precisamente il valore 100059DF16,oppure, se si tratta di un indirizzo, composto da segmento e scostamento,andrebbe inteso come 159DF16.

2942

Page 5: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Registri«

I registri dei microprocessori x86-16 sono schematizzati dalla figurasuccessiva. I registri per uso generale, denominati AX , BX , CX eDX , possono essere utilizzati nella loro interezza o divisi in byte;per esempio si può intervenire nel byte meno significativo di AXcon il nome AL (low) e si può accedere al byte più significativo conil nome AH (high).

|Figura u139.2. I registri dei microprocessori x86-16.

I registri di segmento sono: CS, DS, SS e ES. Il segmento indi-viduato dal registro CS (code segment) è quello in cui si svolge ilcodice in corso di esecuzione, e il puntatore all’istruzione da ese-guire, nell’ambito del segmento codice, è contenuta nel registro IP(instruction pointer, ma noto anche come program counter e indi-cato a volte con la sigla «PC»). Il segmento individuato dal registroSS (stack segment) è quello in cui si trova la pila dei dati, ovve-ro quella struttura che consente il trasferimento delle variabili alle

2943

Page 6: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

funzioni o la creazione di variabili locali. L’indice della pila è co-stituito dal registro SP (stack pointer) e l’indirizzo della base dellapila, nell’ambito della funzione in corso di esecuzione, viene anno-tato convenzionalmente nel registro BP (base pointer). Il segmentoindividuato dal registro DS (data segment) è quello in cui si trovanoi dati correnti, mentre il segmento del registro ES (extra segment)riguarda un’area dati alternativa, utile soprattutto quando si voglionofare dei trasferimenti di dati tra segmenti differenti.

Convenzionalmente è stato adottato il registro BP per annotare ilriferimento all’inizio della pila di una funzione, per poter accede-re agli argomenti attuali o alle variabili locali con un riferimentorelativo a tale puntatore. Tuttavia, va osservato che il segmentoa cui si riferisce il registro BP è quello dei dati, ovvero DS, percui, quando si utilizza BP per accedere al contenuto della pila, èindispensabile che DS sia uguale a SS.

Il registro FLAGS raccoglie gli indicatori disponibili, come de-scritto nella tabella successiva. In alcuni documenti, tale registroè chiamato program status word e abbreviato come «PSW».

|Tabella u139.3. Gli indicatori principali contenuti nel registroFLAGS.

2944

Page 7: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Indicatore(flag) Bit Descrizione

C carry 0

È l’indicatore del riporto per leoperazioni con valori senza se-gno. In particolare si attiva dopouna somma che genera un ripor-to e dopo una sottrazione che ri-chiede il prestito di una cifra (intal caso si chiama anche borrow).

1 1 Riservato.

P parity 2

Si attiva quando l’ultima opera-zione produce un risultato i cuiotto bit meno significativi conten-gono una quantità pari di cifre auno.

0 3 Riservato.A auxiliary carry 4 È un tipo di riporto ausiliario.0 5 Riservato.

Z zero 6Viene impostato dopo un’opera-zione che dà come risultato ilvalore zero.

S sign 7

Riproduce il bit più significativodi un valore, dopo un’operazio-ne. Se il valore è da intender-si con segno, l’indicatore serve ariprodurre il segno stesso.

T trace 8Se è attivo, fa in modo che il mi-croprocessore possa funzionareun passo alla volta.

I interrupt 9Se è attivo, le interruzioni hard-ware sono abilitate, diversamenterisultano bloccate.

2945

Page 8: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Indicatore(flag) Bit Descrizione

D direction 10

Si usa per automatizzare le ope-razioni relative alle stringhe. Seè a zero, indica che la scansionedella memoria deve procedere in-crementando gli indici; se inve-ce è pari a uno, la scansione de-ve proseguire decrementando gliindici.

O overflow 11È l’indicatore di traboccamentoper le operazioni che riguardanovalori con segno.

0 12 Riservato.0 13 Riservato.0 14 Riservato.0 15 Riservato.

I registri che sono definiti «per usi generali», hanno comunque unruolo predominante. Tra questi si includono anche SI e DI:

Registro Definizione Scopo prevalente

AX accumulatore

Usato soprattutto nei calcoli eper l’input e output. Nelle con-venzioni di chiamata comuni, siusa AX per restituire un valoreattraverso una funzione.

BX base

Viene usato particolarmente co-me indice da sommare ad altri,per individuare una posizione inmemoria.

CX contatore Usato come contatore nei cicli.

2946

Page 9: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Registro Definizione Scopo prevalente

DX datiSi affianca a AX , soprattuttonelle divisioni e moltiplicazioni.

SI source indexUsato prevalentemente come in-dice dell’origine, nell’ambito diun segmento dati (DS o ES).

DI destinationindex

Usato prevalentemente come in-dice della destinazione, nell’am-bito di un segmento dati (DS oES).

Trasferimento di dati tra due segmenti differenti«

Il trasferimento di dati tra segmenti di memoria differenti richiedel’uso di istruzioni apposite, con cui il registro DS individua il seg-mento di origine e ES quello di destinazione. Viene mostrato unesempio, con una porzione di codice, che ha lo scopo di copiare unintero segmento, dall’indirizzo efficace 1000016, a 1FFFF16 incluso, apartire dall’indirizzo 3000016, fino a 3FFFF16. La notazione è quella«Intel».

2947

Page 10: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|cld ; Azzera l’indicatore di direzione.

|mov ax, 3000h ; Assegna a ES il segmento di destinazione,

|mov es, ax ; attraverso AX.

|mov ax, 1000h ; Assegna a DS il segmento di origine,

|mov ds, ax ; attraverso AX.

|mov cx, 8000h ; Imposta il contatore a 32768.

|mov si, 0h ; Indice iniziale nel segmento di origine.

|mov di, 0h ; Indice iniziale nel segmento di

| ; destinazione.

|rep ; Ripete l’istruzione successiva finché

| ; CX != 0; riducendo CX di una unità a ogni

| ; ciclo.

|movsw ; Copia 16 bit da DS:SI a ES:DI,

| ; incrementando di due unità sia SI, sia DI

| ; (in base all’indicatore di direzione).

Va osservato che CX riceve inizialmente un valore pari a metà delladimensione di un segmento, perché la copia avviene a coppie di byte,ovvero a interi di 16 bit. Si può notare anche che i registri di seg-mento coinvolti ricevono il valore attraverso la mediazione di AX ,perché non gli si può assegnare direttamente un valore immediato.

Riferimenti a indirizzi di memoria con i registri«

Per indicare un indirizzo di memoria, generalmente si può utilizzareuna costante numerica pura e semplice, ovvero un valore immedia-to, ma spesso è possibile combinare il valore di uno o più registri.Nella notazione Intel, per specificare che il risultato di un’espressio-ne rappresenta un indirizzo di memoria, la si racchiude tra parentesiquadre. Per esempio, ‘-2[DX+SI]’ fa riferimento all’indirizzo dimemoria efficace che si ottiene come DS·16+DX+SI−2 (DS parte-cipa in quanto si fa riferimento a un segmento e può trattarsi solo

2948

Page 11: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

di quello dei dati). Le combinazioni ammissibili sono rappresenta-te dal modello seguente, tenendo conto che qui le parentesi quadreindicano un blocco opzionale:

||[costante]+[BX|BP]+[SI|DI]

|

Lo specchietto successivo riepiloga tutte le combinazioni ammissibi-li, dove la sigla imm rappresenta un valore immediato (una costantenumerica letterale) che può essere sia positivo, sia negativo:

NotazioneIndirizzo efficacecorrispondente Notazione

Indirizzo efficacecorrispondente

|[SI]|[DI]|[BP]|[BX]

|DS·16+SI

|DS·16+DI

|DS·16+BP

|DS·16+BX

|imm[SI]

|imm[DI]

|imm[BP]

|imm[BX]

|DS·16+SI+imm

|DS·16+DI+imm

|DS·16+BP+imm

|DS·16+BX+imm

|[BX+SI]|[BX+DI]|[BP+SI]|[BP+DI]

|DS·16+BX+SI

|DS·16+BX+DI

|DS·16+BP+SI

|DS·16+BP+DI

|imm[BX+SI]

|imm[BX+DI]

|imm[BP+SI]

|imm[BP+DI]

|DS·16+BX+SI+imm

|DS·16+BX+DI+imm

|DS·16+BP+SI+imm

|DS·16+BP+DI+imm

Si osservi che la costante letterale che precede il gruppo tra parentesiquadre può essere sostituita da un nome simbolico, con il quale siindica una variabile in memoria (preferibilmente un array). In talmodo, la notazione richiama quella degli array, come si fa con il

2949

Page 12: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

linguaggio C. Per esempio, ‘x[SI]’, individua così il byte SI-esimoa partire dall’indirizzo a cui si riferisce x.

Convenzioni di chiamata«

Le convenzioni di chiamata adottate per i microprocessori x86-16sono le stesse di quelle usate per x86-32:

• si inseriscono nella pila dei dati gli argomenti della chiamata, inordine inverso, in modo che l’ultimo inserimento sia quello delprimo parametro della funzione;

|push ...

• si esegue la chiamata;

|call ...

• all’interno della funzione si salva il valore di BP nella pila, si as-segna a BP l’indice attuale della pila (in modo da poter usare BPcome riferimento per raggiungere nella pila gli argomenti dellachiamata e le variabili locali) e si allocano nella stessa le variabililocali (variabili automatiche);

|enter ...

• si salvano nella pila i registri che la funzione va a modificare,quindi si procede con il lavoro della funzione;

|pusha

• il primo argomento della chiamata si raggiunge con ‘+4[BP]’, ilsecondo con ‘+6[BP]’,... la prima variabile locale si raggiungecon ‘-2[BP]’, la seconda con ‘-4[BP]’,...

2950

Page 13: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

Al termine della funzione si fa in modo di ripristinare la situazio-ne precedente alla chiamata, restituendo eventualmente un valoreattraverso il registro AX o eventualmente la coppia DX:AX;

• vengono ripristinati i registri salvati all’inizio della funzione;

|popa

• se la funzione deve restituire un valore viene, questo vieneassegnato a AX , oppure DX:AX (se questo valore è da 32 bit);

|mov ax, -m[bp]

|mov dx, -n[bp]

• viene ridotta la pila riportandone l’indice al valore di BP erecuperando il valore precedente di BP;

|leave

• si ritorna all’indirizzo successivo alla chiamata;

|ret

• si espellono gli argomenti della chiamata.

|pop ...

Sintesi delle istruzioni x86-16«

Nelle tabelle successive vengono annotate le istruzioni che possonoessere utilizzate con i microprocessori x86-16, raggruppate secondoil contesto a cui appartengono. Sono però escluse le istruzioni ‘AAx’e ‘DAx’, relative alla gestione dei numeri in formato BCD (Binarycoded decimal).

L’ordine in cui sono specificati gli operandi è quello «Intel», ovveroappare prima la destinazione e poi l’origine. Le sigle usate per defi-

2951

Page 14: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

nire i tipi di operandi sono: reg per «registro»; mem per «memoria»;imm per «immediato» (costante numerica).

Quando appare la pseudocodifica che deve spiegare l’effetto di un’i-struzione, i riferimenti agli indirizzi in memoria vengono fatti in mo-do inusuale. Per esempio, (DS·16+SI) indica un indirizzo in memo-ria, individuato dal registro SI che si riferisce al segmento annotatoin DS. In modo analogo, *(DS·16+SI) individua il contenuto dellamemoria al tale indirizzo, mentre &nome rappresenta l’indirizzo inmemoria del simbolo nome.

Nella colonna degli indicatori appare: il simbolo «#» per annota-re che l’indicatore relativo può essere modificato dall’istruzione; ilsimbolo «t» per annotare che lo stato precedente dell’indicatore vie-ne considerato dall’istruzione; zero o uno se l’indicatore viene im-postato in un certo modo; il simbolo «?» se l’effetto dell’istruzionesull’indicatore è indefinito.

|Tabella u139.16. Assegnamenti, scambi, conversioni e istruzionenulla.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|NOP not operateIstruzione nulla. |cpazstido

·········

2952

Page 15: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|MOVreg, regreg, memreg, immmem, regmem, imm

moveCopia il valore dell’ori-gine nella destinazione.Consente la copia da everso i registri di segmen-to, ma per assegnare unvalore a un registro disegmento occorre esegui-re un passaggio interme-dio attraverso un registroper usi generali. Origi-ne e destinazione devonoavere la stessa quantità dibit.

|dst := org

|cpazstido·········

|LEA reg, mem

load effective addressMette nel registro l’indi-rizzo della memoria, in-teso come scostamentodall’inizio del segmentodati.

|dst := &org

|cpazstido·········

2953

Page 16: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LDS reg, mem

load pointer using DSCarica dalla memoria unvalore a 32 bit, divisoin due blocchi da 16 bit,mettendo il primo bloc-co nel registro indicato emettendo il secondo nelregistro DS (segmentodati).

|DS:dst := org

|cpazstido·········

|LES reg, mem

load pointer using ESCarica dalla memoria unvalore a 32 bit, divisoin due blocchi da 16 bit,mettendo il primo bloc-co nel registro indicato emettendo il secondo nelregistro ES.

|ES:dst := org

|cpazstido·········

|XCHGreg, regreg, memmem, reg

exchange dataScambia i valori.

|dst :==: org|cpazstido·········

2954

Page 17: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|CBW

convert byte to wordConverte un intero consegno, della dimensionedi 8 bit, contenuto in AL,in modo da occupare tut-to AX (da 8 bit a 16 bit).L’espansione tiene contodel segno.

|AX := AL

|cpazstido·········

|CWD

convert word to doublewordConverte un intero consegno, della dimensionedi 16 bit, contenuto inAX , in modo da estender-si anche in DX , tenendoconto del segno.

|IF AX >= 0

THEN

DX := 0

ELSE

DX := FFFF16

|cpazstido·········

2955

Page 18: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LAHF

load flags into AHCarica i primi otto indi-catori in AH, escludendoquelli riservati.

|AHbit0:=c

AHbit1:=1

AHbit2:=p

AHbit3:=0

AHbit4:=a

AHbit5:=0

AHbit6:=z

AHbit7:=s

|cpazstido#########

|SAHF

store AH into flagsModifica il valore dei pri-mi otto indicatori, esclusii bit 1, 3 e 5 (il secondo,il quarto e il sesto, che so-no riservati e a loro nonsi attribuisce un significa-to particolare), scrivendo-ci sopra il contenuto diAH.

|c:=AHbit0

p:=AHbit2

a:=AHbit4

z:=AHbit6

s:=AHbit7

|cpazstido#########

2956

Page 19: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Tabella u139.17. Movimento di dati.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LODSB

load string byteDall’indirizzo a cuipunta la coppia DS:SI(DS·16+SI), viene lettoun byte e copiato inAL. Se l’indicatore didirezione è pari a zero,SI viene incrementatodi una unità, altrimentiviene decrementato diuna unità.

|AL:=*(DS·16+SI)

IF d==0

THEN

SI++

ELSE

SI--

|cpazstido·······t·

·········

2957

Page 20: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LODSW

load string wordDall’indirizzo a cuipunta la coppia DS:SI(DS·16+SI), viene lettoun blocco da 16 bite copiato in AX . Sel’indicatore di direzioneè pari a zero, SI vieneincrementato di dueunità, altrimenti vienedecrementato di dueunità.

|AL:=*(DS·16+SI)

IF d==0

THEN

SI:+=2

ELSE

SI:-=2

|cpazstido·······t·

·········

2958

Page 21: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|STOSB

store string byteAll’indirizzo a cui pun-ta la coppia ES:DI(ES·16+DI), viene scrit-to il valore contenutoin AL, aggiornandoDI in base al conte-nuto dell’indicatore didirezione.

|*(ES·16+DI):=AL

IF d==0

THEN

DI++

ELSE

DI--

|cpazstido·······t·

·········

2959

Page 22: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|STOSW

store string wordAll’indirizzo a cui pun-ta la coppia ES:DI(ES·16+DI), viene scrit-to il valore contenutoin AX , aggiornandoDI in base al conte-nuto dell’indicatore didirezione.

|*(ES·16+DI):=AX

IF d==0

THEN

DI:+=2

ELSE

DI:-=2

|cpazstido·······t·

·········

2960

Page 23: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|MOVSB

move string byteCopia un byte, dall’indi-rizzo a cui punta la cop-pia DS:SI (DS·16+SI),all’indirizzo a cui pun-ta la coppia ES:DI(ES·16+DI), aggiornan-do SI e DI in base alvalore dell’indicatore didirezione.

|*(ES·16+DI):=*(DS·16+SI)

IF d==0

THEN

SI++

DI++

ELSE

SI--

DI--

|cpazstido·······t·

·········

2961

Page 24: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|MOVSW

move string wordCopia un blocco di16 bit, dall’indirizzoa cui punta la coppiaDS:SI (DS·16+SI),all’indirizzo a cui pun-ta la coppia ES:DI(ES·16+DI), aggiornan-do SI e DI in base alvalore dell’indicatore didirezione.

|*(ES·16+DI):=*(DS·16+SI)

IF d==0

THEN

SI:+=2

DI:+=2

ELSE

SI:-=2

DI:-=2

|cpazstido·······t·

·········

2962

Page 25: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|REP

repeatRipete l’istruzionesuccessiva (che puòessere una tra: ‘LODSB’,‘LODSW’, ‘STOSB’,‘STOSW’, ‘MOVSB’,‘MOVSW’), per CX volte.

|IF CX!=0

THEN

istruzione successiva

CX--

ELSE

break

|cpazstido·········

|XLATB

translate table to byteAssegna a AL il valoreche si può raggiungereall’indirizzo compo-sto da DS:BX+AL(DS·16+BX+AL), doveAL va inteso come valoresenza segno.

|AL:=*(DS·16+BX+AL)

|cpazstido·········

2963

Page 26: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Tabella u139.18. Confronti con la memoria.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|SCASB

compare string byteConfronta il contenuto diAL con il valore a cuipunta la coppia ES:DI(ES·16+DI), aggiornan-do di conseguenza gli in-dicatori e anche il registroDI in base all’indicatoredi direzione.

|*(ES·16+DI)-AL

IF d==0

THEN

DI++

ELSE

DI--

|cpazstido·······t·

#####···#

2964

Page 27: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|SCASW

compare string wordConfronta il contenuto diAX con il valore a cuipunta la coppia ES:DI(ES·16+DI), aggiornan-do di conseguenza gli in-dicatori e anche il registroDI in base all’indicatoredi direzione.

|*(ES·16+DI)-AX

IF d==0

THEN

DI:+=2

ELSE

DI:-=2

|cpazstido·······t·

#####···#

2965

Page 28: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|CMPSB

compare string byte inmemoryConfronta il byte a cuipunta la coppia ES:DI(ES·16+DI), con quel-lo a cui punta la coppiaDS:SI (DS·16+SI), ag-giornando di conseguen-za gli indicatori e an-che i registri DI e SIin base all’indicatore didirezione.

|*(DS·16+SI)-*(ES·16+DI)

IF d==0

THEN

SI++

DI++

ELSE

SI++

DI--

|cpazstido·······t·

#####···#

2966

Page 29: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|CMPSW

compare string word inmemoryConfronta il bloccoda 16 bit a cui pun-ta la coppia ES:DI(ES·16+DI), con quelloa cui punta la coppiaDS:SI (DS·16+SI),aggiornando di conse-guenza gli indicatori eanche i registri DI e SIin base all’indicatore didirezione.

|*(DS·16+SI)-*(ES·16+DI)

IF d==0

THEN

SI++

DI++

ELSE

SI++

DI--

|cpazstido·······t·

#####···#

2967

Page 30: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|REPE|REPZ

repeat while equalrepeat while zeroRipete l’istruzionesuccessiva (che puòessere una tra: ‘SCASB’,‘SCASW’, ‘CMPSB’,‘CMPSW’), fino a chel’indicatore z è paria uno (rappresentantel’uguaglianza di unacomparazione, ovveroche la sottrazione dàzero), fino a un massimodi CX volte.

|IF CX!=0

THEN

istruzione successiva

CX--

IF z==1

THEN

continue

ELSE

break

ELSE

break

|cpazstido···#·····

2968

Page 31: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|REPNE|REPNZ

repeat while not equalrepeat while not zeroRipete l’istruzionesuccessiva (che puòessere una tra: ‘SCASB’,‘SCASW’, ‘CMPSB’,‘CMPSW’), fino a chel’indicatore z è pari azero (rappresentante ladisuguaglianza dellacomparazione, ovveroche la sottrazione non dàzero), fino a un massimodi CX volte.

|IF CX!=0

THEN

istruzione successiva

CX--

IF z==0

THEN

continue

ELSE

break

ELSE

break

|cpazstido···#·····

2969

Page 32: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Tabella u139.19. Operazioni aritmetiche.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|NEG regmem

negationInverte il segno di un nu-mero, attraverso il com-plemento a due.

|operand := −operand

|cpazstido##·##···#

|ADDreg, regreg, memreg, immmem, regmem, imm

additionSomma di interi, cono senza segno, ignoran-do il riporto precedente.Se i valori si intendonocon segno, è importan-te l’esito dell’indicatoredi traboccamento (over-flow), se invece i valo-ri sono da intendersi sen-za segno, è importantel’esito dell’indicatore diriporto (carry).

|dst := org + dst

|cpazstido##·##···#

|SUBreg, regreg, memreg, immmem, regmem, imm

subtractionSottrazione di interi con osenza segno, ignorando ilriporto precedente.

|dst := org − dst

|cpazstido##·##···#

2970

Page 33: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|ADCreg, regreg, memreg, immmem, regmem, imm

addition with carrySomma di interi, con osenza segno, aggiungen-do anche il riporto pre-cedente (l’indicatore car-ry).

|dst := org + dst + c

|cpazstidot········

##·##···#

|SBBreg, regreg, memreg, immmem, regmem, imm

subtraction with borrowSottrazione di interi, cono senza segno, tenendoconto del «prestito» pre-cedente (l’indicatore car-ry).

|dst := org + dst − c

|cpazstidot········

##·##···#

|INC regmem

incrementIncrementa di una unitàun intero.

|operand++

|cpazstido·#·##···#

|DEC regmem

decrementDecrementa di una unitàun valore intero.

|operand−−

|cpazstido·#·##···#

2971

Page 34: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|MUL regmem

multiplyMoltiplicazione interasenza segno. L’operan-do è il moltiplicatore,mentre il moltiplicandoè costituito da registriprestabiliti.

|AX := AL*operand

DX:AX := AX*operand

|cpazstido#?·??···#

|DIV regmem

divisionDivisione intera senza se-gno. L’operando è il di-visore, mentre il dividen-do è costituito da registriprestabiliti.

|AL := AX/operand

AH := AX%operand

AX := (DX:AX)/operand

DX := (DX:AX)%operand

|cpazstido??·??···?

|IMUL regmem

signed multiplyMoltiplicazione interacon segno. In questocaso l’operando è ilmoltiplicatore, mentre ilmoltiplicando è costituitoda registri prestabiliti.

|AX := AL*operand

(DX:AX) := AX*operand

|cpazstido#?·??···#

2972

Page 35: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|IDIV regmem

signed divisionDivisione intera con se-gno. L’operando è il di-visore, mentre il dividen-do è costituito da registriprestabiliti.

|AL := AX/operand

AH := AX%operand

AX := (DX:AX)/operand

DX := (DX:AX)%operand

|cpazstido??·??···?

|Tabella u139.20. Operazioni logiche.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|NOT regmem

NOT di tutti i bitdell’operando.

|dst := NOT dst|cpazstido·········

|AND|OR|XOR

reg, regreg, memreg, immmem, regmem, imm

AND, OR, o XOR,tra tutti i bit dei dueoperandi.

|dst := org AND dst

dst := org OR dst

dst := org XOR dst

|cpazstido0#·##···0

2973

Page 36: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Tabella u139.21. Scorrimenti e rotazioni.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|SHL|SHR

reg, 1mem, 1regmem

shift leftshift rightFa scorrere i bit, ri-spettivamente verso sini-stra o verso destra (l’ul-tima cifra perduta finiscenell’indicatore del ripor-to). Se appare un so-lo operando, la rotazio-ne viene eseguita CL vol-te. Se il valore immedia-to è maggiore di uno, èil compilatore che ripetel’istruzione per più volte.

|cpazstido#·······#

2974

Page 37: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|SAL|SAR

reg, 1mem, 1regmem

shift arithmetically leftshift arithmetically rightFa scorrere i bit, rispet-tivamente verso sinistrao verso destra (l’ultimacifra perduta finisce nel-l’indicatore del riporto),mantenendo il segnooriginale (logicamente‘SAL’ è identico a ‘SHL’).Se appare un solo ope-rando, la rotazione vieneeseguita CL volte. Seil valore immediato èmaggiore di uno, è ilcompilatore che ripetel’istruzione per più volte.

|cpazstido#········

2975

Page 38: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|RCL|RCR

reg, 1mem, 1regmem

rotate left with carryrotate right with carryRuota i bit, rispettiva-mente verso sinistra overso destra, utilizzandoanche l’indicatore di ri-porto (carry). Se appareun solo operando, la rota-zione viene eseguita CLvolte. Se il valore imme-diato è maggiore di uno,è il compilatore che ripetel’istruzione per più volte.

|cpazstidot········

#·······#

|ROL|ROR

reg, 1mem, 1regmem

rotate leftrotate rightRuota i bit, rispettiva-mente verso sinistra overso destra. Se appareun solo operando, la rota-zione viene eseguita CLvolte. Se il valore imme-diato è maggiore di uno,è il compilatore che ripetel’istruzione per più volte.

|cpazstido#·······#

2976

Page 39: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Tabella u139.22. Chiamate e gestione della pila.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|CALLregmemimm

Inserisce nella pilal’indirizzo dell’istruzionesuccessiva e salta all’in-dirizzo indicato, che si ri-ferisce allo scostamento apartire dall’inizio del seg-mento codice (CS). Per-tanto, l’indirizzo a cui cisi riferisce è a 16 bit.

|push indirizzo_successivo

IP := operand

|cpazstido·········

|CALL FAR imm:imm

call procedureInserisce nella pila il va-lore di CS e poi l’indiriz-zo dell’istruzione succes-siva (IP dell’istruzionesuccessiva) e salta all’in-dirizzo indicato. L’indi-rizzo deve essere di quat-tro byte (32 bit), in quan-to deve specificare an-che il segmento codice daraggiungere.

|push CS

push indirizzo_successivo

CS:IP := operand

|cpazstido·········

2977

Page 40: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|RET

return from callEstrae dalla pila l’indiriz-zo dell’istruzione da rag-giungere (IP) e salta aquella (serve a conclude-re una chiamata eseguitacon ‘CALL’).

|pop IP

|cpazstido·········

|RETF|RET FAR

return from far callEstrae dalla pila il valo-re di CS e quindi l’in-dirizzo dell’istruzione daraggiungere (IP) e salta aquella (serve a conclude-re una chiamata eseguitacon ‘CALL FAR’).

|pop IP

pop CS

|cpazstido·········

|PUSH regmem

push data onto stackInserisce nella pila il va-lore (della dimensione diun registro comune).

|SP:-=2

*(SS·16+SP):=operand

|cpazstido·········

2978

Page 41: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|POP regmem

pop data from stackEstrae dalla pila l’ultimovalore inserito (della di-mensione di un registrocomune).

|operand:=*(SS·16+SP)

SP:+=2

|cpazstido·········

|PUSHFpush flags onto stack

Inserisce nella pila l’in-sieme del registro degliindicatori (FLAGS).

|push FLAGS

|cpazstido·········

|POPF

pop flags from stackEstrae dalla pila l’insie-me del registro degli indi-catori (FLAGS), aggior-nando di conseguenza ilregistro stesso.

|pop FLAGS

|cpazstido?????????

2979

Page 42: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|ENTER imm8, 0

enter stack frameQuesta funzione esiste apartire dai microproces-sori i186.Inserisce nella pila il va-lore di BP, poi assegna aBP il valore di SP e infi-ne decrementa SP del va-lore fornito come imme-diato. Serve a predisporreBP e SP all’inizio di unafunzione, specificando lospazio necessario per levariabili locali nella pila.

|push BP

BP:=SP

SP:-=2*dst

|cpazstido·········

2980

Page 43: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|PUSHA

push all registers ontostackQuesta funzione esiste apartire dai microproces-sori i186.Inserisce nella pila i regi-stri principali: AX , CX ,DX , BX , SP, BP, SI,DI.

|push AX

push CX

push DX

push BX

push SP

push BP

push SI

push DI

|cpazstido·········

2981

Page 44: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|POPA

pop all registers fromstackQuesta funzione esiste apartire dai microproces-sori i186.Ripristina i registri prin-cipali, estraendo i conte-nuti dalla pila: DI, SI,BP, SP viene elimina-to senza aggiornare il re-gistro, BX , DX , CX ,AX . Come si vede, an-che se ‘PUSHA’ salva l’in-dice della pila, in praticaquesto indice non vieneripristinato.

|pop DI

pop SI

pop BP

SP:+=2

pop BX

pop DX

pop CX

pop AX

|cpazstido·········

2982

Page 45: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LEAVE

leave stack frameQuesta funzione esiste apartire dai microproces-sori i186.Ripristina i valori di BPe di SP, allo stato cheavevano prima dell’usodell’istruzione ‘ENTER’.

|SP:=BP

pop BP

|cpazstido·········

|Tabella u139.23. Interruzioni.

2983

Page 46: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|INT imm8

call to interruptEsegue una chiamata at-traverso un’interruzione.Prima di saltare alla codi-ce relativo all’interruzio-ne selezionata, inseriscenella pila FLAGS, CS eIP. Azzera anche l’indi-catore IF (interrupt flag),mentre gli altri indicatoririmangono inalterati.

|pusfpush CS

push IP

i:=0

jmp far 0:(operand·4)

|cpazstido·········

2984

Page 47: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|IRET

return from interruptConclude l’esecuzionedel codice relativo aun’interruzione recupe-rando dalla pila i valoriinseriti alla chiamata con‘INT’: IP, CS e FLAGS.Pertanto, il valore degliindicatori viene ripristi-nato allo stato precedentealla chiamata.

|pop IP

pop CS

popf

|cpazstido##·##···#

|CLI

clear interrupt flagAzzera l’indicatore diabilitazione delle inter-ruzioni (interrupt flag),disabilitando di conse-guenza le interruzionihardware.

|i:=0

|cpazstido······0··

2985

Page 48: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|STI

set interrupt flagAttiva l’indicatore di abi-litazione delle interruzio-ni (interrupt flag), abili-tando di conseguenza leinterruzioni hardware.

|i := 1

|cpazstido······1··

|HLTenter halt state

Ferma il sistema, finoa quando viene ricevu-ta un’interruzione hard-ware.

|cpazstido·········

|INTO

interrupt if overflowSe l’indicatore di stra-ripamento è attivo, ese-gue la chiamata dell’in-terruzione numero 4 (laquale dovrebbe gestore ilproblema).

|cpazstido········t

·········

|Tabella u139.24. Indicatori e confronti tra registri.

2986

Page 49: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|CLC

clear carry flagAzzera l’indicatore del ri-porto (carry), senza inter-venire negli altri indicato-ri.

|c:=0

|cpazstido0········

|CLD

clear direction flagAzzera l’indicatore di di-rezione (direction), sen-za intervenire negli altriindicatori.

|d:=0

|cpazstido·······0·

|STCset carry flag

Attiva l’indicatore di ri-porto (carry).

|c:=1|cpazstido1········

|STDset direction flag

Attiva l’indicatore di di-rezione (direction).

|d:=1|cpazstido·······1·

|CMCcomplement carry flag

Inverte il valore dell’indi-catore del riporto (carry).

|cpazstido#········

2987

Page 50: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|CMPreg, regreg, memreg, immmem, regmem, imm

compare operandsConfronta due valori inte-ri. La comparazione av-viene simulando la sot-trazione dell’origine dal-la destinazione, senza pe-rò modificare gli operan-di, ma aggiornando gli in-dicatori, come se fosseavvenuta una sottrazionevera e propria.

|dst - org

|cpazstido##·##···#

|TESTreg, regreg, immmem, regmem, imm

logical compareAND dei due valori sen-za conservare il risulta-to. Serve solo a ottene-re l’aggiornamento degliindicatori.

|dst AND org

|cpazstido0#·##···0

|Tabella u139.25. Salti.

2988

Page 51: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JMPregmemimm

jumpSalto incondizionato al-l’indirizzo indicato, chesi intende relativo al seg-mento codice (CS).

|IP:=operand

|cpazstido·········

|JMP FAR

imm:imm

far jumpSalto incondizionato al-l’indirizzo indicato, co-stituito sia dal segmen-to codice, sia dall’indiriz-zo relativo, all’interno diquesto.

|CS:IP:=operand

|cpazstido·········

|JA|JNBE

imm

conditional jumpDopo un confronto di va-lori senza segno, salta sela destinazione era mag-giore dell’origine. Il saltoriguarda solo l’ambito delsegmento codice attuale.

|CMP dst, org

IF dst > org

THEN

go to imm

|cpazstidot··t·····

2989

Page 52: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JAE|JNB

imm

conditional jumpDopo un confronto di va-lori senza segno, salta sela destinazione era mag-giore o uguale all’origi-ne. Il salto riguarda so-lo l’ambito del segmentocodice attuale.

|CMP dst, org

IF dst >= org

THEN

go to imm

|cpazstidot··t·····

|JB|JNAE

imm

conditional jumpDopo un confronto di va-lori senza segno, salta sela destinazione era mino-re dell’origine. Il salto ri-guarda solo l’ambito delsegmento codice attuale.

|CMP dst, org

IF dst < org

THEN

go to imm

|cpazstidot··t·····

2990

Page 53: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JBE|JNA

imm

conditional jumpDopo un confronto di va-lori senza segno, salta sela destinazione era mino-re o uguale all’origine. Ilsalto riguarda solo l’am-bito del segmento codiceattuale.

|CMP dst, org

IF dst <= org

THEN

go to imm

|cpazstidot··t·····

|JE imm

conditional jumpDopo un confronto, in-dipendentemente dal se-gno, salta se la destina-zione era uguale all’origi-ne. Il salto riguarda so-lo l’ambito del segmentocodice attuale.

|CMP dst, org

IF dst == org

THEN

go to imm

|cpazstido···t·····

2991

Page 54: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JNE imm

conditional jumpDopo un confronto, in-dipendentemente dal se-gno, salta se la destina-zione era diversa dall’ori-gine. Il salto riguarda so-lo l’ambito del segmentocodice attuale.

|CMP dst, org

IF dst != org

THEN

go to imm

|cpazstido···t·····

|JG|JNLE

imm

conditional jumpDopo un confronto consegno, salta se la destina-zione era maggiore del-l’origine. Il salto ri-guarda solo l’ambito delsegmento codice attuale.

|CMP dst, org

IF dst > org

THEN

go to imm

|cpazstido···tt···t

2992

Page 55: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JGE|JNL

imm

conditional jumpDopo un confronto consegno, salta se la desti-nazione era maggiore ouguale all’origine. Il sal-to riguarda solo l’ambi-to del segmento codiceattuale.

|CMP dst, org

IF dst >= org

THEN

go to imm

|cpazstido···tt···t

|JL|JNGE

imm

conditional jumpDopo un confronto consegno, salta se la destina-zione era minore dell’ori-gine. Il salto riguarda so-lo l’ambito del segmentocodice attuale.

|CMP dst, org

IF dst < org

THEN

go to imm

|cpazstido···tt···t

2993

Page 56: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JLE|JNG

imm

conditional jumpDopo un confronto consegno, salta se la destina-zione era minore o ugua-le all’origine. Il salto ri-guarda solo l’ambito delsegmento codice attuale.

|CMP dst, org

IF dst <= org

THEN

go to imm

|cpazstido···tt···t

|JC|JNC

imm

conditional jumpSalta se l’indicatore delriporto (carry), rispettiva-mente, è attivo, oppurenon è attivo. Il salto ri-guarda solo l’ambito delsegmento codice attuale.

|cpazstidot········

|JO|JNO

imm

conditional jumpSalta se l’indicatore ditraboccamento (over-flow), rispettivamente,è attivo, oppure non èattivo.

|cpazstido········t

|JS|JNS

imm

conditional jumpSalta se l’indicatore di se-gno (sign), rispettivamen-te, è attivo, oppure non èattivo.

|cpazstido····t····

2994

Page 57: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|JZ|JNZ

imm

conditional jumpSalta se l’indicatore di ze-ro, rispettivamente, è atti-vo, oppure non è attivo.

|cpazstido···t·····

|JP|JPE

immconditional jump

Salta se l’indicatore diparità è attivo.

|cpazstido·t·······

|JNP|JPO

immconditional jump

Salta se l’indicatore diparità non è attivo.

|cpazstido·t·······

|JCXZ imm

conditional jumpSalta se il valore contenu-to nel registro CX è pari azero.

|cpazstido·········

|Tabella u139.26. Iterazioni

2995

Page 58: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LOOP imm8

loopSenza alterare gli indica-tori, decrementa di unaunità il registro ‘CX’,quindi, se il registro è an-cora diverso da zero, sal-ta all’indirizzo cui fa rife-rimento l’operando. Ta-le indirizzo non può es-sere molto lontano dallaposizione corrente.

|cpazstido·········

|LOOPE|LOOPZ

imm8

conditional loopSenza alterare gli indica-tori, decrementa di unaunità il registro ‘CX’,quindi, se il registro èancora diverso da zero el’indicatore «zero» è atti-vo, salta all’indirizzo cuifa riferimento l’operan-do. Tale indirizzo nonpuò essere molto lontanodalla posizione corrente.

|cpazstido···t·····

2996

Page 59: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|LOOPNE

|LOOPNZ

imm8

conditional loopSenza alterare gli indica-tori, decrementa di unaunità il registro ‘CX’,quindi, se il registro èancora diverso da zero el’indicatore «zero» non èattivo, salta all’indirizzocui fa riferimento l’ope-rando. Tale indirizzo nonpuò essere molto lontanodalla posizione corrente.

|cpazstido···t·····

|Tabella u139.27. Input e output.

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|IN AL, imm8AX , imm8

inputAssegna a AL o AX il va-lore letto dalla porta spe-cificata; in tal caso il nu-mero di porta non puòessere superiore a 255.

|cpazstido·········

|IN AL, DXAX , DX

inputAssegna a AL o AX il va-lore letto dalla porta spe-cificata da DX; in tal ca-so il numero di porta puòessere superiore a 255.

|cpazstido·········

2997

Page 60: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

NomeOperandi:dst, org1, org2 Descrizione Indicatori

|OUT imm8, ALimm8, AX

outputScrive nella porta specifi-cata il valore contenuto inAL o AX; in tal caso ilnumero di porta non puòessere superiore a 255.

|cpazstido·········

|OUT DX , ALDX , AX

outputScrive nella porta indica-ta da DX il valore con-tenuto in AL o AX; intal caso il numero di por-ta può essere superiore a255.

|cpazstido·········

Sostituzione delle istruzioni per i186«

Nella sezione precedente sono state menzionate delle istruzioni chenon fanno parte dei microprocessori 8086/8088, ma queste posso-no essere ottenute facilmente attraverso altre istruzioni elementari,tanto che l’assemblatore potrebbe provvedervi direttamente. A ognimodo viene annotato qui come possono essere sostituite.

2998

Page 61: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Listato u139.28. Sostituzione per l’istruzione ‘PUSHA’.

|push ax

|push cx

|push dx

|push bx

|push sp

|push bp

|push si

|push di

|Listato u139.29. Sostituzione per l’istruzione ‘POPA’. Il registroSP non viene ripristinato, di conseguenza si riduce l’indice dellapila (si incrementa SP) senza estrarne il valore.

|pop di

|pop si

|pop bp

|add sp, 2 ; non ripristina SP

|pop bx

|pop dx

|pop cx

|pop ax

2999

Page 62: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

|Listato u139.30. Sostituzione per l’istruzione ‘ENTER’. La ri-duzione di SP dipende dalla quantità di variabili locali che sivogliono gestire. Usando interi da 16 bit, si tratta di moltiplicarela quantità di variabili locali per due. Va ricordato che il segmen-to a cui si riferisce BP è DS, per cui è indispensabile che DSsia uguale a SS, essendo usato in questo modo come riferimentoalla pila.

|push bp

|mov bp, sp

|sub sp, 2 ; 0, 2, 4, 6,...

|Listato u139.31. Sostituzione per l’istruzione ‘LEAVE’.

|mov sp, bp

|pop bp

Riferimenti«

• Andrew S. Tanenbaum, Operating Systems: Design and Im-plementation, prima edizione, 1987, Prentice-Hall, ISBN0-13-637406-9Appendice B: introduction to the IBM PC

• MAD, Assembly tutorialhttp://www.xs4all.nl/~smit/asm01001.htm

• Wikipedia, x86 instruction listingshttp://en.wikipedia.org/wiki/X86_instruction_listings

• The x86 Interrupt List, aka "Ralf Brown’s Interrupt List", "RBIL"http://www.cs.cmu.edu/~ralf/files.html

3000

Page 63: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

• Computer interrupthttp://wayback.archive.org/web/20040101000000*/http://calab.kaist.ac.kr/~hyoon/courses/cs310_2001fa01ll/micro17.ppthttp://www.ece.msstate.edu/~reese/EE3724/lectures/interrupt/interrupt.pdf

• BiosCentral, BIOS data areahttp://www.bioscentral.com/misc/bda.htm

• Robert de Bath, Linux 8086 development environmenthttp://homepage.ntlworld.com/robert.debath/http://homepage.ntlworld.com/robert.debath/dev86/

3001

Page 64: Microprocessori x86-16 - a2.pluto.ita2.pluto.it/a2//microprocessori_x86_16.pdf · con il nome AL (low) e si può accedere al byte più significativo con il nome AH (high). Figura

3002