Microprocessore - 8086 Set di istruzioni
Il microprocessore 8086 supporta 8 tipi di istruzioni:
- Istruzioni per il trasferimento dei dati
- Istruzioni aritmetiche
- Istruzioni per la manipolazione dei bit
- Istruzioni di stringa
- Istruzioni di trasferimento dell'esecuzione del programma (istruzioni Branch & Loop)
- Istruzioni per il controllo del processore
- Istruzioni per il controllo dell'iterazione
- Istruzioni di interruzione
Discutiamo ora in dettaglio questi set di istruzioni.
Istruzioni per il trasferimento dei dati
Queste istruzioni vengono utilizzate per trasferire i dati dall'operando di origine all'operando di destinazione. Di seguito è riportato l'elenco delle istruzioni in questo gruppo:
Istruzioni per trasferire una parola
MOV - Utilizzato per copiare il byte o la parola dalla sorgente fornita alla destinazione fornita.
PPUSH - Usato per mettere una parola in cima alla pila.
POP - Usato per ottenere una parola dalla cima della pila alla posizione fornita.
PUSHA - Usato per mettere tutti i registri nello stack.
POPA - Usato per portare le parole dallo stack a tutti i registri.
XCHG - Utilizzato per scambiare i dati da due posizioni.
XLAT - Utilizzato per tradurre un byte in AL utilizzando una tabella in memoria.
Istruzioni per il trasferimento delle porte di input e output
IN - Utilizzato per leggere un byte o una parola dalla porta fornita all'accumulatore.
OUT - Utilizzato per inviare un byte o una parola dall'accumulatore alla porta fornita.
Istruzioni per trasferire l'indirizzo
LEA - Utilizzato per caricare l'indirizzo dell'operando nel registro fornito.
LDS - Usato per caricare il registro DS e altri registri forniti dalla memoria
LES - Utilizzato per caricare il registro ES e altri registri forniti dalla memoria.
Istruzioni per trasferire i registri flag
LAHF - Utilizzato per caricare AH con il byte basso del registro flag.
SAHF - Utilizzato per memorizzare il registro AH nel byte basso del registro flag.
PUSHF - Usato per copiare il registro flag in cima allo stack.
POPF - Usato per copiare una parola in cima allo stack nel registro flag.
Istruzioni aritmetiche
Queste istruzioni vengono utilizzate per eseguire operazioni aritmetiche come addizione, sottrazione, moltiplicazione, divisione, ecc.
Di seguito è riportato l'elenco delle istruzioni in questo gruppo:
Istruzioni per eseguire l'aggiunta
ADD - Utilizzato per aggiungere il byte fornito a byte / parola a parola.
ADC - Usato per aggiungere con riporto.
INC - Utilizzato per incrementare il byte / parola fornito di 1.
AAA - Usato per regolare ASCII dopo l'aggiunta.
DAA - Utilizzato per regolare il decimale dopo l'operazione di addizione / sottrazione.
Istruzioni per eseguire la sottrazione
SUB - Usato per sottrarre il byte da byte / parola dalla parola.
SBB - Usato per eseguire la sottrazione con il prestito.
DEC - Usato per decrementare il byte / parola fornito di 1.
NPG - Usato per negare ogni bit del byte / parola fornito e aggiungere il complemento di 1/2.
CMP - Usato per confrontare 2 byte / parola forniti.
AAS - Utilizzato per regolare i codici ASCII dopo la sottrazione.
DAS - Utilizzato per regolare i decimali dopo la sottrazione.
Istruzioni per eseguire la moltiplicazione
MUL - Usato per moltiplicare byte senza segno per byte / parola per parola.
IMUL - Utilizzato per moltiplicare byte con segno per byte / parola per parola.
AAM - Utilizzato per regolare i codici ASCII dopo la moltiplicazione.
Istruzioni per eseguire la divisione
DIV - Utilizzato per dividere la parola senza segno per byte o la doppia parola senza segno per parola.
IDIV - Usato per dividere la parola con segno per byte o la doppia parola con segno per parola.
AAD - Utilizzato per regolare i codici ASCII dopo la divisione.
CBW - Usato per riempire il byte superiore della parola con le copie del bit di segno del byte inferiore.
CWD - Usato per riempire la parola superiore della doppia parola con il bit di segno della parola inferiore.
Istruzioni per la manipolazione dei bit
Queste istruzioni vengono utilizzate per eseguire operazioni in cui sono coinvolti bit di dati, ovvero operazioni come logica, spostamento, ecc.
Di seguito è riportato l'elenco delle istruzioni in questo gruppo:
Istruzioni per eseguire un'operazione logica
NOT - Usato per invertire ogni bit di un byte o di una parola.
AND - Utilizzato per aggiungere ogni bit in un byte / parola con il bit corrispondente in un altro byte / parola.
OR - Usato per moltiplicare ogni bit in un byte / parola con il bit corrispondente in un altro byte / parola.
XOR - Utilizzato per eseguire un'operazione di OR esclusivo su ogni bit in un byte / parola con il bit corrispondente in un altro byte / parola.
TEST - Utilizzato per aggiungere operandi per aggiornare i flag, senza influire sugli operandi.
Istruzioni per eseguire operazioni su turni
SHL/SAL - Usato per spostare i bit di un byte / parola verso sinistra e inserire zero (S) negli LSB.
SHR - Usato per spostare i bit di un byte / parola verso destra e mettere zero (S) in MSB.
SAR - Usato per spostare i bit di un byte / parola verso destra e copiare il vecchio MSB nel nuovo MSB.
Istruzioni per eseguire operazioni di rotazione
ROL - Utilizzato per ruotare i bit di byte / parola verso sinistra, ad esempio MSB su LSB e Carry Flag [CF].
ROR - Utilizzato per ruotare i bit di byte / parola verso destra, cioè da LSB a MSB e per trasportare Flag [CF].
RCR - Utilizzato per ruotare i bit di byte / parola verso destra, cioè da LSB a CF e da CF a MSB.
RCL - Utilizzato per ruotare i bit di byte / parola verso sinistra, ovvero MSB in CF e CF in LSB.
Istruzioni di stringa
La stringa è un gruppo di byte / parole e la loro memoria è sempre allocata in ordine sequenziale.
Di seguito è riportato l'elenco delle istruzioni in questo gruppo:
REP - Usato per ripetere l'istruzione data fino a CX ≠ 0.
REPE/REPZ - Usato per ripetere l'istruzione data fino a quando CX = 0 o zero flag ZF = 1.
REPNE/REPNZ - Usato per ripetere l'istruzione data fino a quando CX = 0 o zero flag ZF = 1.
MOVS/MOVSB/MOVSW - Utilizzato per spostare il byte / parola da una stringa all'altra.
COMS/COMPSB/COMPSW - Utilizzato per confrontare due byte / parole di stringa.
INS/INSB/INSW - Utilizzato come stringa / byte / parola di input dalla porta I / O alla posizione di memoria fornita.
OUTS/OUTSB/OUTSW - Utilizzato come stringa / byte / parola di output dalla posizione di memoria fornita alla porta I / O.
SCAS/SCASB/SCASW - Usato per scansionare una stringa e confrontare il suo byte con un byte in AL o una parola stringa con una parola in AX.
LODS/LODSB/LODSW - Utilizzato per memorizzare il byte della stringa in AL o la parola della stringa in AX.
Istruzioni di trasferimento dell'esecuzione del programma (istruzioni di diramazione e di loop)
Queste istruzioni vengono utilizzate per trasferire / ramificare le istruzioni durante un'esecuzione. Include le seguenti istruzioni:
Istruzioni per trasferire l'istruzione durante un'esecuzione senza alcuna condizione -
CALL - Usato per chiamare una procedura e salvare il loro indirizzo di ritorno nello stack.
RET - Usato per tornare dalla procedura al programma principale.
JMP - Utilizzato per saltare all'indirizzo fornito per procedere all'istruzione successiva.
Istruzioni per trasferire l'istruzione durante un'esecuzione con alcune condizioni -
JA/JNBE - Usato per saltare se l'istruzione sopra / non sotto / uguale soddisfa.
JAE/JNB - Usato per saltare se le istruzioni sopra / non sotto soddisfano.
JBE/JNA - Usato per saltare se l'istruzione inferiore / uguale / non superiore soddisfa.
JC - Usato per saltare se carry flag CF = 1
JE/JZ - Usato per saltare se flag uguale / zero ZF = 1
JG/JNLE - Usato per saltare se l'istruzione maggiore / non minore / uguale soddisfa.
JGE/JNL - Usato per saltare se maggiore / uguale / non minore dell'istruzione soddisfa.
JL/JNGE - Usato per saltare se l'istruzione minore / non maggiore / uguale soddisfa.
JLE/JNG - Usato per saltare se minore / uguale / se non maggiore dell'istruzione soddisfa.
JNC - Usato per saltare se non c'è flag di riporto (CF = 0)
JNE/JNZ - Usato per saltare se non uguale / zero flag ZF = 0
JNO - Usato per saltare se nessun flag di overflow OF = 0
JNP/JPO - Usato per saltare se non parità / parità dispari PF = 0
JNS - Usato per saltare se non segno SF = 0
JO - Usato per saltare se il flag di overflow OF = 1
JP/JPE - Usato per saltare se parità / parità anche PF = 1
JS - Usato per saltare se il flag di segno SF = 1
Istruzioni per il controllo del processore
Queste istruzioni vengono utilizzate per controllare l'azione del processore impostando / ripristinando i valori dei flag.
Di seguito sono riportate le istruzioni in questo gruppo:
STC - Usato per impostare carry flag CF su 1
CLC - Usato per cancellare / resettare il flag di carry CF su 0
CMC - Usato per mettere il complemento allo stato di carry flag CF.
STD - Usato per impostare il flag di direzione DF su 1
CLD - Usato per cancellare / ripristinare il flag di direzione DF su 0
STI - Utilizzato per impostare il flag di abilitazione interrupt su 1, ovvero abilitare l'ingresso INTR.
CLI - Usato per cancellare il flag di abilitazione interrupt a 0, cioè disabilitare l'ingresso INTR.
Istruzioni per il controllo dell'iterazione
Queste istruzioni vengono utilizzate per eseguire le istruzioni fornite per il numero di volte. Di seguito è riportato l'elenco delle istruzioni in questo gruppo:
LOOP - Utilizzato per eseguire il ciclo di un gruppo di istruzioni finché la condizione non è soddisfatta, ovvero CX = 0
LOOPE/LOOPZ - Usato per ripetere un gruppo di istruzioni finché non soddisfa ZF = 1 e CX = 0
LOOPNE/LOOPNZ - Usato per ripetere un gruppo di istruzioni finché non soddisfa ZF = 0 e CX = 0
JCXZ - Utilizzato per saltare all'indirizzo fornito se CX = 0
Istruzioni di interruzione
Queste istruzioni vengono utilizzate per richiamare l'interrupt durante l'esecuzione del programma.
INT - Utilizzato per interrompere il programma durante l'esecuzione e la chiamata del servizio specificato.
INTO - Usato per interrompere il programma durante l'esecuzione se OF = 1
IRET - Usato per tornare dal servizio di interruzione al programma principale