[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 551.   Microprocessori x86-32

In questo capitolo si descrivono, in modo superficiale, le caratteristiche più importanti dei microprocessori x86 a 32 bit, assieme a un elenco di istruzioni essenziali che possono essere utilizzate nella loro programmazione.

551.1   Terminologia impropria

È bene ricordare che nella documentazione standard sui microprocessori x86 si usa una terminologia coerente, ma impropria, riferita alla dimensione delle unità di dati. In particolare, il problema nasce dal fatto che originariamente questi microprocessori avevano parole da 16 bit, così è stato associato il termine word a 16 bit ed è rimasta tale l'associazione anche con la trasformazione successiva a 32 bit. Pertanto, generalmente valgono le convenzioni riportate nella tabella successiva.

Tabella 551.1. Terminologia associata alla dimensione dei dati nei microprocessori x86.

Definizione o
abbreviazione
Dimensione dei dati Definizione o
abbreviazione
Dimensione dei dati
«b», byte 8 bit «w», word 16 bit
«d», «dw», dword,
double word
32 bit «q», «qw», qword,
quad word
64 bit

551.2   Registri principali fino ai 32 bit

I registri dei microprocessori x86 sono stati inizialmente da 16 bit; successivamente, quelli principali sono stati estesi a 32 bit. Alcuni registri hanno una funzione ben precisa; gli altri sono utilizzabili per scopi generali, ma in pratica ognuno ha un compito preferenziale.

Tutti i registri che sono stati estesi da 16 bit; a 32 bit; hanno due nomi: uno riferito alla porzione dei 16 bit meno significativi, l'altro che riguarda il registro nel suo complesso. Inoltre, per quattro registri in particolare, è possibile individuare anche i due byte che compongono la parte meno significativa. Per esempio, il registro EAX ha una dimensione di 32 bit, di cui è possibile individuare i 16 bit meno significativi con il nome AX, ma in più, il nome AL individua il byte meno significativo di AX mentre AH ne individua quello più significativo.

Il registro EIP (o IP nei microprocessori a 16 bit) viene gestito automaticamente e serve a contenere l'indirizzo dell'istruzione successiva da eseguire. In effetti, la gestione manuale di tale registro non sarebbe conveniente, dal momento che la dimensione delle istruzioni in linguaggio macchina varia in base al tipo e agli operandi.

Il registro ESP (o SP nei microprocessori a 16 bit) individua l'ultimo elemento della pila dei dati e può essere gestito manualmente, sapendo che questo indice si deve spostare a gruppi di quattro byte (o due byte nella versione a 16 bit) e che la pila cresce diminuendo l'indice.

Il registro EBP (o BP nei microprocessori a 16 bit) si affianca all'indice della pila, per tenere conto della posizione raggiunta all'inizio di una funzione.

Il registro EFLAGS (o FLAGS nei microprocessori a 16 bit) raccoglie i vari indicatori che descrivono l'esito delle operazioni svolte. In particolare sono importanti gli indicatori che appaiono nella tabella 551.3.

Figura 551.2. Registri principali.

fusione

Tabella 551.3. Gli indicatori principali, contenuti nel registro FLAGS.

Indicatore
(flag)
Descrizione
C carry È l'indicatore del riporto per le operazioni con valori senza segno. In particolare si attiva dopo una somma che genera un riporto e dopo una sottrazione che richiede il prestito di una cifra (in tal caso si chiama anche borrow).
O overflow È l'indicatore di traboccamento per le operazioni che riguardano valori con segno.
Z zero Viene impostato dopo un'operazione che dà come risultato il valore zero.
S sign Riproduce il bit più significativo di un valore, dopo un'operazione. Se il valore è da intendersi con segno, l'indicatore serve a riprodurre il segno stesso.
P parity Si attiva quando l'ultima operazione produce un risultato i cui otto bit meno significativi contengono una quantità pari di cifre a uno.

551.3   Sintesi delle istruzioni principali

Nelle tabelle successive vengono annotate le istruzioni più semplici che possono essere utilizzate con i microprocessori x86, raggruppate secondo il contesto a cui appartengono. In modo particolare sono assenti le istruzioni per i calcoli in virgola mobile e quelle per la gestione delle stringhe.

L'ordine in cui sono specificati gli operandi è quello «Intel», ovvero appare prima la destinazione e poi l'origine. Le sigle usate per definire i tipi di operandi sono: reg per «registro»; mem per «memoria»; imm per «immediato» (costante numerica).

Nella colonna degli indicatori appare: il simbolo «#» per annotare che l'indicatore relativo può essere modificato dall'istruzione; il simbolo «t» per annotare che lo stato precedente dell'indicatore viene considerato dall'istruzione; zero o uno se l'indicatore viene impostato in un certo modo; il simbolo «?» se l'effetto dell'istruzione sull'indicatore è indefinito.

Tabella 551.4. Assegnamenti, scambi, conversioni e istruzione nulla.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
NOP
Istruzione nulla.
c p z s o
· · · · ·
MOV
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
Copia il valore dell'origine nella destinazione. Origine e destinazione devono avere la stessa quantità di bit.
dst := org
c p z s o
· · · · ·
LEA
reg32, mem load effective address
Mette nel registro l'indirizzo della memoria.
dst := indirizzo(org)
c p z s o
· · · · ·
MOVSX
reg16, reg8
reg16, mem8
reg32, reg8
reg32, mem8
reg32, reg16
reg32, mem16
Tratta il valore nell'origine come un numero con segno e lo estende in modo da occupare tutto lo spazio della destinazione.
c p z s o
· · · · ·
MOVZX
reg16, reg8
reg16, mem8
reg32, reg8
reg32, mem8
reg32, reg16
reg32, mem16
Tratta il valore nell'origine come un numero senza segno e lo estende in modo da occupare tutto lo spazio della destinazione.
c p z s o
· · · · ·
XCHG
reg, reg
reg, mem
mem, reg
Scambia i valori.
dst :==: org
c p z s o
· · · · ·
CBW
Converte un intero con segno, della dimensione di 8 bit, contenuto in AL, in modo da occupare tutto AX (da 8 bit a 16 bit). L'espansione tiene conto del segno.
AX := AL
c p z s o
· · · · ·
CWDE
Converte un intero con segno, della dimensione di 16 bit, contenuto in AX, in modo da occupare EAX (da 16 bit a 32 bit). L'espansione tiene conto del segno.
EAX := AX
c p z s o
· · · · ·
CDQ
Converte un intero con segno, della dimensione di 32 bit, contenuto in EAX, in modo da occupare la somma di EDX:EAX (da 32 bit a 64 bit). L'espansione tiene conto del segno.
EDX:EAX := EAX
c p z s o
· · · · ·
BSWAP
reg32 Inverte l'ordine dei byte contenuti nel registro: quello meno significativo diventa il più significativo; la coppia interna si scambia.
c p z s o
· · · · ·

Tabella 551.5. Operazioni aritmetiche.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
NEG
reg
mem
Inverte il segno di un numero, attraverso il complemento a due.
dst := -dst
c p z s o
# # # # #
ADD
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
Somma di interi, con o senza segno, ignorando il riporto precedente. Se i valori si intendono con segno, è importante l'esito dell'indicatore di traboccamento (overflow), se invece i valori sono da intendersi senza segno, è importante l'esito dell'indicatore di riporto (carry).
dst := org + dst
c p z s o
# # # # #
SUB
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
Sottrazione di interi con o senza segno, ignorando il riporto precedente.
dst := org - dst
c p z s o
# # # # #
ADC
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
Somma di interi, con o senza segno, aggiungendo anche il riporto precedente (l'indicatore carry).
dst := org + dst + c
c p z s o
t · · · ·
# # # # #
SBB
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
Sottrazione di interi, con o senza segno, tenendo conto del «prestito» precedente (l'indicatore carry).
dst := org + dst - c
c p z s o
t · · · ·
# # # # #
INC
reg
mem
Incrementa di una unità un intero.
dst++
c p z s o
· # # # #
DEC
reg
mem
Decrementa di una unità un valore intero.
dst--
c p z s o
· # # # #
MUL
reg
mem
Moltiplicazione intera senza segno. L'operando è il moltiplicatore, mentre il moltiplicando è costituito da registri prestabiliti.
AX := AL*src
DX:AX := AX*src
EDX:EAX := EAX*src
c p z s o
# ? ? ? #
DIV
reg
mem
Divisione intera senza segno. L'operando è il divisore, mentre il dividendo è costituito da registri prestabiliti.
AL := AX/src AH := resto
AX := DX:AX/src DX := resto
EAX := EDX:EAX/src EDX := resto
c p z s o
? ? ? ? ?
IMUL
reg
mem
Moltiplicazione intera con segno. In questo caso l'operando è il moltiplicatore, mentre il moltiplicando è costituito da registri prestabiliti.
AX := AL*src
DX:AX := AX*src
EDX:EAX := EAX*src
c p z s o
# ? ? ? #
IDIV
reg
mem
Divisione intera con segno. L'operando è il divisore, mentre il dividendo è costituito da registri prestabiliti.
AL := AX/src AH := resto
AX := DX:AX/src DX := resto
EAX := EDX:EAX/src EDX := resto
c p z s o
? ? ? ? ?

Tabella 551.6. Operazioni logiche.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
NOT
reg
mem
NOT di tutti i bit dell'operando.
dst := NOT dst
c p z s o
· · · · ·
AND
OR
XOR
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
AND, OR, o XOR, tra tutti i bit dei due operandi.
dst := org AND dst
dst := org OR dst
dst := org XOR dst
c p z s o
0 # # # 0

Tabella 551.7. Scorrimenti e rotazioni.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
SHL
SHR
reg, 1
mem, 1
reg
mem
Fa scorrere i bit, rispettivamente verso sinistra o verso destra (l'ultima cifra perduta finisce nell'indicatore del riporto). Se appare un solo operando, la rotazione viene eseguita CL volte. Se il valore immediato è maggiore di uno, è il compilatore che ripete l'istruzione per più volte.
c p z s o
# · · · #
SAL
reg, 1
mem, 1
reg
mem
Funziona esattamente come SHL, ma esiste in quanto è la controparte di SAR, riferendosi a uno scorrimento aritmetico.
c p z s o
# · · · #
SAR
reg, 1
mem, 1
reg
mem
Fa scorrere i bit verso destra (l'ultima cifra perduta finisce nell'indicatore del riporto), mantenendo il segno originale. Se appare un solo operando, la rotazione viene eseguita CL volte. Se il valore immediato è maggiore di uno, è il compilatore che ripete l'istruzione per più volte.
c p z s o
# · · · ·
RCL
RCR
reg, 1
mem, 1
reg
mem
Ruota i bit, rispettivamente verso sinistra o verso destra, utilizzando anche l'indicatore di riporto (carry). Se appare un solo operando, la rotazione viene eseguita CL volte. Se il valore immediato è maggiore di uno, è il compilatore che ripete l'istruzione per più volte.
c p z s o
t · · · ·
# · · · #
ROL
ROR
reg, 1
mem, 1
reg
mem
Ruota i bit, rispettivamente verso sinistra o verso destra. Se appare un solo operando, la rotazione viene eseguita CL volte. Se il valore immediato è maggiore di uno, è il compilatore che ripete l'istruzione per più volte.
c p z s o
# · · · #

Tabella 551.8. Chiamate e gestione della pila.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
INT
imm8 Esegue una chiamata attraverso un'interruzione.
c p z s o
· · · · ·
CALL
reg
mem
imm
Inserisce nella pila l'indirizzo dell'istruzione successiva e salta all'indirizzo indicato.
c p z s o
· · · · ·
RET
Estrae dalla pila l'indirizzo dell'istruzione da raggiungere e salta a quella (serve a concludere una chiamata eseguita con CALL).
c p z s o
· · · · ·
PUSH
reg
mem
Inserisce nella pila il valore (della dimensione di un registro comune).
c p z s o
· · · · ·
POP
reg
mem
Estrae dalla pila l'ultimo valore inserito (della dimensione di un registro comune).
c p z s o
· · · · ·
PUSHF
Inserisce nella pila l'insieme del registro degli indicatori (FLAGS o EFLAGS).
c p z s o
· · · · ·
POPF
Estrae dalla pila l'insieme del registro degli indicatori (FLAGS o EFLAGS), aggiornando di conseguenza il registro stesso.
c p z s o
· · · · ·
PUSHA
PUSHAD
Inserisce nella pila i registri principali: PUSHA inserisce nella pila i registri da 16 bit, mentre PUSHAD li inserisce a 32 bit. In sequenza vengono inseriti: AX, CX, DX, BX, SP, BP, SI, DI; ovvero: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI.
Si osservi che di solito si usa solo PUSHA, lasciando al compilatore la responsabilità di scegliere quale istruzione è appropriata per il contesto.
c p z s o
· · · · ·
POPA
POPAD
Ripristina i registri principali, estraendo i contenuti dalla pila: POPA ripristina i registri da 16 bit, mentre POPAD riguarda quelli da 32 bit. In sequenza vengono estratti: DI, SI, BP, SP viene eliminato senza aggiornare il registro, BX, DX, CX, AX; ovvero: EDI, ESI, EBP, ESP viene eliminato senza aggiornare il registro, EBX, EDX, ECX, EAX. Come si vede, anche se PUSHA e PUSHAD salvano l'indice della pila, in pratica questo indice non viene ripristinato.
Si osservi che di solito si usa solo POPA, lasciando al compilatore la responsabilità di scegliere quale istruzione è appropriata per il contesto.
c p z s o
· · · · ·

Tabella 551.9. Indicatori e confronti.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
CLC
Azzera l'indicatore del riporto (carry), senza intervenire negli altri indicatori.
c p z s o
0 · · · ·
CMC
Inverte il valore dell'indicatore del riporto (carry).
c p z s o
# · · · ·
CMP
reg, reg
reg, mem
reg, imm
mem, reg
mem, imm
Confronta due valori interi. La comparazione avviene simulando la sottrazione dell'origine dalla destinazione, senza però modificare gli operandi, ma aggiornando gli indicatori, come se fosse avvenuta una sottrazione vera e propria.
dst - org
c p z s o
# # # # #
TEST
reg, reg
reg, imm
mem, reg
mem, imm
AND dei due valori senza conservare il risultato. Serve solo a ottenere l'aggiornamento degli indicatori.
dst AND org
c p z s o
0 # # # 0

Tabella 551.10. Salti.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
JMP
reg
mem
imm
Salto incondizionato all'indirizzo indicato.
c p z s o
· · · · ·
JA
JNBE
imm Dopo un confronto di valori senza segno, salta se la destinazione era maggiore dell'origine.
CMP dst, org
IF dst > org
THEN go to imm
c p z s o
t · t · ·
JAE
JNB
imm Dopo un confronto di valori senza segno, salta se la destinazione era maggiore o uguale all'origine.
CMP dst, org
IF dst >= org
THEN go to imm
c p z s o
t · t · ·
JB
JNAE
imm Dopo un confronto di valori senza segno, salta se la destinazione era minore dell'origine.
CMP dst, org
IF dst < org
THEN go to imm
c p z s o
t · t · ·
JBE
JNA
imm Dopo un confronto di valori senza segno, salta se la destinazione era minore o uguale all'origine.
CMP dst, org
IF dst <= org
THEN go to imm
c p z s o
t · t · ·
JE
imm Dopo un confronto, indipendentemente dal segno, salta se la destinazione era uguale all'origine.
CMP dst, org
IF dst == org
THEN go to imm
c p z s o
· · t · ·
JNE
imm Dopo un confronto, indipendentemente dal segno, salta se la destinazione era diversa dall'origine.
CMP dst, org
IF dst =/= org
THEN go to imm
c p z s o
· · t · ·
JG
JNLE
imm Dopo un confronto con segno, salta se la destinazione era maggiore dell'origine.
CMP dst, org
IF dst > org
THEN go to imm
c p z s o
· · t t t
JGE
JNL
imm Dopo un confronto con segno, salta se la destinazione era maggiore o uguale all'origine.
CMP dst, org
IF dst >= org
THEN go to imm
c p z s o
· · t t t
JL
JNGE
imm Dopo un confronto con segno, salta se la destinazione era minore dell'origine.
CMP dst, org
IF dst < org
THEN go to imm
c p z s o
· · t t t
JLE
JNG
imm Dopo un confronto con segno, salta se la destinazione era minore o uguale all'origine.
CMP dst, org
IF dst <= org
THEN go to imm
c p z s o
· · t t t
JC
JNC
imm Salta se l'indicatore del riporto (carry), rispettivamente, è attivo, oppure non è attivo.
c p z s o
t · · · ·
JO
JNO
imm Salta se l'indicatore di traboccamento (overflow), rispettivamente, è attivo, oppure non è attivo.
c p z s o
· · · · t
JS
JNS
imm Salta se l'indicatore di segno (sign), rispettivamente, è attivo, oppure non è attivo.
c p z s o
· · · t ·
JZ
JNZ
imm Salta se l'indicatore di zero, rispettivamente, è attivo, oppure non è attivo.
c p z s o
· · t · ·
JP
JNP
imm Salta se l'indicatore di parità, rispettivamente, è attivo, oppure non è attivo.
c p z s o
· t · · ·
JCXZ
imm Salta se il valore contenuto nel registro CX è pari a zero.
c p z s o
· · · · ·

Tabella 551.11. Impostazione del valore in base all'esito di un confronto.

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
SETA
SETNBE
reg8
mem8
Dopo un confronto di valori senza segno, imposta a uno il registro o la memoria indicati, se la destinazione era maggiore dell'origine.
CMP dst, org
IF dst > org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETAE
SETNB
reg8
mem8
Dopo un confronto di valori senza segno, imposta a uno il registro o la memoria indicati, se la destinazione era maggiore o uguale all'origine.
CMP dst, org
IF dst >= org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETB
SETNAE
reg8
mem8
Dopo un confronto di valori senza segno, imposta a uno il registro o la memoria indicati, se la destinazione era minore dell'origine.
CMP dst, org
IF dst < org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETBE
SETNA
reg8
mem8
Dopo un confronto di valori senza segno, imposta a uno il registro o la memoria indicati, se la destinazione era minore o uguale all'origine.
CMP dst, org
IF dst <= org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETE
reg8
mem8
Dopo un confronto, indipendentemente dal segno, imposta a uno il registro o la memoria indicati, se la destinazione era uguale all'origine.
CMP dst, org
IF dst == org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETNE
reg8
mem8
Dopo un confronto, indipendentemente dal segno, imposta a uno il registro o la memoria indicati, se la destinazione era diversa dall'origine.
CMP dst, org
IF dst =/= org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETG
SETNLE
reg8
mem8
Dopo un confronto con segno, imposta a uno il registro o la memoria indicati, se la destinazione era maggiore dell'origine.
CMP dst, org
IF dst > org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETGE
SETNL
reg8
mem8
Dopo un confronto con segno, imposta a uno il registro o la memoria indicati, se la destinazione era maggiore o uguale all'origine.
CMP dst, org
IF dst >= org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETL
SETNGE
reg8
mem8
Dopo un confronto con segno, imposta a uno il registro o la memoria indicati, se la destinazione era minore dell'origine.
CMP dst, org
IF dst < org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETLE
SETNG
reg8
mem8
Dopo un confronto con segno, imposta a uno il registro o la memoria indicati, se la destinazione era minore o uguale all'origine.
CMP dst, org
IF dst <= org
THEN x:=1
ELSE x:=0
c p z s o
· · · · ·
SETC
SETNC
reg8
mem8
Imposta a uno il registro o la memoria indicati, se l'indicatore del riporto (carry), rispettivamente, è attivo, oppure non è attivo.
c p z s o
t · · · ·
SETO
SETNO
reg8
mem8
Imposta a uno il registro o la memoria indicati, se l'indicatore di traboccamento (overflow), rispettivamente, è attivo, oppure non è attivo.
c p z s o
· · · · t
SETS
SETNS
reg8
mem8
Imposta a uno il registro o la memoria indicati, se l'indicatore di segno (sign), rispettivamente, è attivo, oppure non è attivo.
c p z s o
· · · t ·
SETZ
SETNZ
reg8
mem8
Imposta a uno il registro o la memoria indicati, se l'indicatore di zero, rispettivamente, è attivo, oppure non è attivo.
c p z s o
· · t · ·

Tabella 551.12. Iterazioni

Nome Operandi:
dstorg1org2
Descrizione Indicatori
principali:
carry,
parity,
zero, sign,
overflow
LOOP
imm8 Senza alterare gli indicatori, decrementa di una unità il registro ECX (o solo CX, se viene richiesta una dimensione più piccola), quindi, se il registro è ancora diverso da zero, salta all'indirizzo cui fa riferimento l'operando.
c p z s o
· · · · ·
LOOPE
LOOPZ
imm8 Senza alterare gli indicatori, decrementa di una unità il registro ECX (o solo CX, se viene richiesta una dimensione più piccola), quindi, se il registro è ancora diverso da zero e l'indicatore «zero» è attivo, salta all'indirizzo cui fa riferimento l'operando.
c p z s o
· · t · ·
LOOPNE
LOOPNZ
imm8 Senza alterare gli indicatori, decrementa di una unità il registro ECX (o solo CX, se viene richiesta una dimensione più piccola), quindi, se il registro è ancora diverso da zero e l'indicatore «zero» non è attivo, salta all'indirizzo cui fa riferimento l'operando.
c p z s o
· · t · ·

551.4   Riferimenti


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome microprocessori_x86_32.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory