Processeurs 80x86
Registres
Registres du micro-processeur 8086
Mémoire
Mémoire du micro-processeur 8086
Adressage par segments
Adressage du micro-processeur 8086
Instruction de chargement et rangement
- MOV chargement et rangement
- PUSH empilement
- POP dépilement
Instructions arithmétiques
Le micro-processeur possède un jeu d'instruction à deux opérandes.
Ceci signifie que dans les opération arithmétiques et logiques, la
destination est nécessairement une des deux operandes.
- INC incrémentation
- DEC décrémentation
- ADD addition
- ADC addition avec retenue
- SUB soustraction
- CMP comparaison (soustraction sans rangement)
- NEG opposé
Instructions logiques
- NOT négation
- OR, XOR ou logique et ou exclusif
- AND, TEST et logique et et logique
sans rangement
- SHL, SHR, SAL, SAR décalages gauche
et droite
- ROL, ROR, RCL, RCR rotations
gauche et droite (avec injection de la retenue)
Branchements
- JMP branchement
- JZ, JNZ branchement si zéro ou non
- JO, JNO branchement si débordement (Overflow) ou non
- JS, JNS branchement si négatif ou non
- JA, JAE, JG, JGE branchement si
plus grand (ou égal) ou non
- JB, JBE, JL, JLE branchement si
plus petit (ou égal) ou non
Appel et retour de sous-routine
- CALL et CALLF appel et appel lointain
- RET et RETF retour et retour lointain
- INT appel système
Modes d'adressages
- absolu
- indirect
- avec les registres BX, SI ou DI
- base + offset
- avec les registres BP, BX, BI ou SI avec offset 8 ou 16 bits
- indexé
- l'addresse est la somme de deux registres. Les paires possibles
sont BX+SI, BX+DI, BP+SI et BP+DI
- base + index + offset
- identique au mode précédent avec en plus un offset 8 ou 16 bits
Instructions complexes
- PUSHA, POPA empilement et dépilement de tous
les registres
- ECHG échange de deux valeurs
- MOVS déplacement de chaîne : mem[ES:DI] ← mem[DS:SI];
DI ← DI+1; SI ← SI+1. Cette instruction peut être précédée
d'un préfixe comme REP, REPZ ou REPNZ qui
donne le nombre de fois à la répéter.
- LOOP label décrémentation et saut : DEC CX et
JNZ label
Programmation
Voici un petit exemple de programme qui calcule la longueur d'une
chaîne de caractères
; Segment de données
data SEGMENT
chaine DB 'Hello world\0'
data ENDS
; Segment de code
code SEGMENT
ASSUME DS:data, CS:code
main: ; Initialisation du registre de segment de données
MOV AX,data
MOV DS,AX
; Chargement de l'adresse de la chaîne dans BX
; Il s'agit de l'adresse relative au début du segment
MOV BX,offset chaine
; Initialisation compteur
MOV CX,0
loop: MOV AL,[BX]
CMP AL,0 ; Test de fin de chaîne
JZ fini
INC BX ; Incrémentation pointeur
INC CX ; Incrémentation compteur
JMP loop
fini: ; Retour au DOS
MOV AH,4CH
INT 21H
code ENDS
END main ; Adresse de lancement