Title: Etienne Tremblay
1Etienne Tremblay
- Ordinateurs, Structure et Applications
GIF-16116
Cours 8, Registres, Mémoire et Instructions
Arithmétiques/Logiques du 8086
Université Laval, Hiver 2007
2Registres et drapeaux
Tiré du didacticiel de EMU8086
3Les registres
- AX Registre accumulateur 16 bits ( composé de
deux registres 8 bits, AH et AL). - BX Registre d'adresses de base 16 bits (composé
de deux registres 8 bits, BH et BL). - CX Registre compteur 16 bits (composé de deux
registres 8 bits, CH et CL). - DX Registre de données 16 bits (composé de deux
registres 8 bits, DH et DL). - SI Registre d'index source 16 bits.
- DI Registre d'index destination 16 bits.
- BP Registre pointeur de base 16 bits.
- SP Registre pointeur de pile 16 bits.
- IP Instruction pointeur 16 bits.
Tiré du didacticiel de EMU8086
4Les drapeaux
- Carry Flag (CF) Ce flag est à 1 lorsquil y a
une retenue. - Zero Flag (ZF) - Ce flag est à 1 lorsque le
résultat est zéro. - Sign Flag (SF) - Ce flag est à 1 lorsque le
résultat est négatif. - Overflow Flag (OF) - Ce flag est à 1 lorsqu'un
débordement a lieu. - Parity Flag (PF) - Ce flag est à 1 lorsque le
résultat est un nombre pair de bits. Même si le
résultat est un Word (mot), uniquement les 8 bits
de poids faible sont analysés ! - Auxiliary Flag (AF) - Ce flag est à 1 lorsqu'un
débordement non signé a lieu sur les 4 bits de
poids faible. - Interrupt enable Flag (IF) - Lorsque ce flag est
à 1, le processeur réagit aux interruptions des
dispositifs externes. - Direction Flag (DF) - Ce flag est utilisé par
quelques instructions pour traiter les chaînes de
données, Lorsque ce drapeau est placé à 0, la
chaîne est traitée octet par octet en
incrémentant, lorsque ce drapeau est placé à 1,
la chaîne est traitée octet par octet en
décrémentant.
Les drapeaux sont tous contenus dans un unique
registre de status.
5Mémoire et registres segments (1)
- Le 8086 a 20 lignes dadresses et peut donc
accéder à une mémoire de 220 adresses, soit 1Mo
ou FFFFh. - Chaque case de mémoire contient 1 byte.
- Comme les registres nont que 16 bits, un
registre seul ne peut quaccéder à 64Ko de
mémoire. - Les registres segments permettent daccéder à
toutes les adresses de la mémoire. - Il y a 4 segments un segment de code (le
programme), 2 segments de données (les variables)
et 1 segment pour la pile (voir plus loin). - La convention Little Endian est utilisée pour
stocker des mots de 2 bytes
6Mémoire et registres segments (2)
- Les 4 registres segments sont CS (Code Seg.), DS
(Data Seg.), ES (Extra Data Seg.) et SS (Stack
Seg.). - Les registres de segment ont 16 bits. Leur valeur
multipliées par 16 (équivaut à ajouter un 0 en
hex) donne la première adresse dun segment. - Le segment de code contient le programme, ceux de
data, les données, et celui de Stack, la pile. Il
est cependant possible dutiliser les registres
de segments à dautres fins (déconseillé). - Les segments peuvent être superposés (overlap).
- À moins de modifier les registres segments à
lintérieur même dun programme, la taille
maximum dun programme est 464k 256k. Un
programme où tous les registres segments ont la
même valeur fait 64k (.com).
7Les registres segments et associations
- Chaque registre segment doit être associé à un ou
plusieurs registres afin de former une adresse
physique réelle. La table suivante donne ces
associations
- Une adresse physique est exprimée sous la forme
aaaabbbb en hexadécimal où aaaa est le segment
et bbbb est loffset (ou adresse virtuelle!?!).
La valeur de ladresse physique sur 20 bits est
aaaa0hbbbb ou encore aaaa16bbbb. - Supposons par exemple que CS vaille 1111h et que
IP vaille AAAAh. Alors, ladresse de
linstruction de programme pointée par IP (celle
qui sera exécutée) est 11110 0AAAAh 1BBBAh. - Pour les instructions affectant la pile (PUSH,
POP, CALL, RET, etc.), SSSP est utilisé. SSBP
est ladresse de base de la pile. - DSBX est utilisé avec linstruction MOV (qui
équivaut à une affectation) pour chercher des
données en mémoire. - DSSI et ESSI sont habituellement utilisés pour
travailler sur des tableaux ou des chaînes de
caractères.
8Les modes dadressage (MOV)
- Un mode dadressage est une instruction offerte
par un microprocesseur afin de transférer de
linformation dun emplacement mémoire à un autre
emplacement. Cest une opération daffectation
souvent représentée en assembleur par
linstruction MOV. - Pour le 8086, linstruction MOV dst,src signifie
mettre le contenu de src (la source) dans dst (la
destination). On dit que dst et src quils sont
des opérandes. - Src et dst peuvent être certains registres, des
adresses (variables) ou des constantes (immédiate
en anglais, dst ne peut pas être une constante!). - Le 8086 supporte des transferts de bytes ou de
mots (1 word 2 bytes) dans certains cas. Src et
dst doivent toujours avoir la même taille.
9Les modes dadressage (2)
- MOV REG, mémoire Direct addressing mode, base
adressing mode, etc. - MOV mémoire, REG
- MOV REG, REG Register Mode
- MOV mémoire, immédiate
- MOV REG, immédiate Immediate Mode
- REG AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH,
DL, DI, SI, BP, SP. - mémoire BYTE PTR BX, WORD PTR BX,
BXSI7, variable, etc. - immédiate 5, -24, 3Fh, 10001101b, etc.
- MOV SREG, mémoire
- MOV mémoire, SREG
- MOV REG, SREG
- MOV SREG, REG
- SREG DS, ES, SS, source seulement CS.
- REG AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH,
DL, DI, SI, BP, SP. - mémoire b. BX, w. BX, BXSI7, variable,
etc.
Tiré du didacticiel de EMU8086, Ajouts de Etienne
Tremblay
10Variables
- Une variable est un nom donné à une adresse de
mémoire. Il nexiste pas dinstruction pour créer
ou manipuler des variables. Il nexiste que des
instructions pour manipuler la mémoire. - Les variables sont des créations du langage
assembleur afin de faciliter la création dun
programme Il est plus facile de retenir un nom
quune adresse de mémoire!!! - Avec les assembleurs de 8086, la syntaxe pour
déclarer une variable est - nom DB valeur pour déclarer une variable dun
byte dont la valeur initiale est valeur et le nom
est nom. - nom DW valeur pour déclarer une variable dun
mot. - Linstruction DB sert à un insérer un byte dans
la mémoire du 8086. Ladresse de ce byte est
ladresse de la variable. DW insère 2 bytes Il
est possible, si lon connaît les opcodes et les
opérandes des instructions du 8086 décrire un
programme avec des DB! - Lassembleur soccupera de remplacer tous les
noms des variables par les adresses correspondant
à ces nom. - Linstruction LEA permet daller chercher
ladresse dune variable. OFFSET aussi, voir le
didacticiel de EMU8086. - Note Changer la valeur de DS peut créer de jolis
problèmes avec les variables.
11Tableaux
- Les tableaux peuvent être vus comme des chaînes
de variables. Une chaîne texte est un exemple de
tableau d'octets, chaque caractère est présenté
comme un élément de code ASCII (0 à 255). Voici
quelques exemples de définition d'un tableau a
DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00hb DB 'Hello', 0
b est la copie exacte d'une rangée, lorsque le
compilateur voit une chaîne entourée par des
guillemets, il la convertit automatiquement en un
ensemble d'octets. - Si vous devez déclarer un grand tableau, vous
pouvez utiliser l'opérateur DUP.Par exemple c
DB 5 DUP(9) La déclaration sans DUP c DB 9, 9,
9, 9, 9
Tiré du didacticiel de EMU8086
12Constantes
- La directive assembleur EQU permet de déclarer
des constantes (comme un define en C). Exemple
MyConst EQU 12h. - Lors de lassemblage, tous les MyConst de
lexemple ci-dessous seraient remplacés par 12h
13Instructions arithmétiques et logiques, principe
- Les instructions arithmétiques et logiques sont
des opération mathématiques (, -, , /) ou
booléennes (AND, XOR, NOT, ROL, ROR) opérée sur
des bits. Les nombres sont exprimées en notation
complément 2. - Les instructions arithmétiques et logiques
changent presque toujours les valeurs de certains
drapeaux (en fonction de linstruction). - Le résultat de lopération est habituellement
placé dans le premier opérande ADD A,B vaut A
A B. - Plusieurs registres ne peuvent être utilisés pour
des opérations arithmétiques et seuls AX,BX,CX et
DX peuvent être utilisés directement pour les
opérations avec des bytes.
14ADD, SUB, CMP, AND, TEST, OR, XOR
2 opérandes REG, mémoiremémoire, REGREG,
REGmémoire, immédiatREG, immédiat REG AX,
BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI,
SI, BP, SP.Ces instructions affectent les flags
suivants CF, ZF, SF, OF, PF, AF. ADD - Ajoute
le deuxième opérande au premier. SUB - Soustrait
le deuxième opérande au premier. CMP - Soustrait
le deuxième opérande au premier pour les flags
uniquement. AND - Compare par un ET logique tous
les bits des deux opérandes. TEST - Idem à AND
mais pour les flags uniquement. OR - Effectue un
OU logique entre tous les bits des deux
opérandes. XOR - Effectue un OU exclusif logique
entre tous les bits des deux opérandes.
Tiré du didacticiel de EMU8086. Modifié par
Etienne Tremblay
15Exemple dopérations sur des bits
- Supposons que lon veille mettre le bit 3 (23)
de AX à 0, mais laisser le reste du registre
intact - AND AL, F7h
- Supposons que lon veille mettre le bit 3 (24)
de AX à 1, mais laisser le reste du registre
intact - OR AL, 08h
16MUL, IMUL, DIV, IDIV
- 1 seul opérande REG ou mémoire
- REG AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH,
DL, DI, SI, BP, SP. Les instructions MUL et
IMUL affectent uniquement les flags CF et OF
lorsque le résultat est plus grand que la taille
de l'opérande ces flags sont placés à 1, lorsque
la taille de l'opérante est ajustée ces flags
sont placés à 0. Pour DIV et IDIV les flags ne
sont pas définis. - MUL - Multiplication non signée
- byte AX AL opérande.
- word (DX AX) AX opérande.
- IMUL - Multiplication signée
- byte AX AL opérande.
- word (DX AX) AX opérande.
- DIV - Division non signée
- byte AL AX / opérande AH reste (modulo)
- word AX (DX AX) / opérande DX reste
(modulo) - IDIV - Division signée
- byte AL AX / opérande AH reste (modulo)
- word AX (DX AX) / opérande DX reste
(modulo)
Tiré du didacticiel de EMU8086. Modifié par
Etienne Tremblay
17Note sur les multiplications et divisions
- En base deux, les multiplications et les
divisions par des multiples de 2 peuvent
(devraient!!!) se faire avec ROR, ROL (ROtate
Left/Right), SAR et SAL (arithmetic left/right
shift) . - Schéma de RCR, RCL, SAR, SAL, ROL et ROR pour une
rotation de 1 bit
18INC, DEC, NOT, NEG
- Un opérande REG ou mémoire
- REG AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH,
DL, DI, SI, BP, SP. Les instructions INC, DEC
affectent les flags suivants ZF, SF, OF, PF,
AF.L'instruction NOT n'affecte aucun
flag.L'instruction NEG affecte les flags
suivants CF, ZF, SF, OF, PF, AF. - INC Ajoute 1 à l'opérande.
- DEC Soustrait 1 à l'opérande.
- NOT - Inverse chaque bit de l'opérande.
- NEG - Effectue un complément à 2 sur l'opérande
négative. En fait, inverse chaque bit de
l'opérande et lui ajoute 1. - Note Si vous navez quun seul byte de 0 à 255,
la meilleur façon dajouter 256 est dajouter
255, puis dajouter 1
Tiré du didacticiel de EMU8086. Modifié par
Etienne Tremblay
19Références et exercices
- Références pour tout lassembleur
- Irv Englander chapitre 12 (jusquà la page 351)
et Annexe 2. - http//www.commentcamarche.net/asm/assembleur.php3
- http//www.ifrance.com/zarbi-os/DOCS/chap2.htm
(très bon résumé) - Didacticiel de EMU8086 (Pour débutants, mais bien
fait) - www.intel.com/design/intarch/datashts/24018708.pdf
(datasheet du 8086) - William Stallings chapitre 10 11.2
- Exercices
- Lire le didacticiel de EMU8086