Decimal-Binary-Hexadecimal Conversion Chart

publicité
Decimal-Binary-Hexadecimal Conversion Chart
This chart shows all of the combinations of decimal, binary and hexadecimal from 0 to 25 5 decimal. When m aking a change in a C V this chart will show the conversion for different
nu mb ering system s. Som e deco ders sp lit the C V in to tw o pa rts. W hen y ou mo dify a CV you need to w rite back all 8 bits. T his cha rt will help deter min e the co rrect bit va lue a C V.
Decimal
Bit N o.>
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Binary
Hex
00000000
00000001
00000010
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00001010
00001011
00001100
00001101
00001110
00001111
00010000
00010001
00010010
00010011
00010100
00010101
00010110
00010111
00011000
00011001
00011010
00011011
00011100
00011101
00011110
00011111
00100000
00100001
00100010
00100011
00100100
00100101
00100110
00100111
00101000
00101001
00101010
00101011
00101100
00101101
00101110
00101111
00110000
00110001
00110010
00110011
00110100
00110101
00110110
00110111
00111000
00111001
00111010
00111011
00111100
00111101
00111110
00111111
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F
CVs
CV-6 M id Point Voltage
CV -7 Ver N um ber
CV-8 M aker ID
CV -17 /18 Lo ng A ddress
CV -19 Co nsist A ddress
CV-21 Advance Consist function control
Binary
Hex
Decimal
76543210
Binary Num ber System for one byte
Bit Number| 7| 6| 5| 4|3|2|1|0|
Bit Weight|128|64|32|16|8|4|2|1|
Some Commonly used
CV -1 S hort Ad dress
CV-2 Start Voltage
CV -3 Acc eleration Ra te
CV -4 D eceleratio n R ate
CV-5 M aximum Voltage
Decimal
76543210
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
01000000
01000001
01000010
01000011
01000100
01000101
01000110
01000111
01001000
01001001
01001010
01001011
01001100
01001101
01001110
01001111
01010000
01010001
01010010
01010011
01010100
01010101
01010110
01010111
01011000
01011001
01011010
01011011
01011100
01011101
01011110
01011111
01100000
01100001
01100010
01100011
01100100
01100101
01100110
01100111
01101000
01101001
01101010
01101011
01101100
01101101
01101110
01101111
01110000
01110001
01110010
01110011
01110100
01110101
01110110
01110111
01111000
01111001
01111010
01111011
01111100
01111101
01111110
01111111
Binary
Hex
Decimal
76543210
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
10000000
10000001
10000010
10000011
10000100
10000101
10000110
10000111
10001000
10001001
10001010
10001011
10001100
10001101
10001110
10001111
10010000
10010001
10010010
10010011
10010100
10010101
10010110
10010111
10011000
10011001
10011010
10011011
10011100
10011101
10011110
10011111
10100000
10100001
10100010
10100011
10100100
10100101
10100110
10100111
10101000
10101001
10101010
10101011
10101100
10101101
10101110
10101111
10110000
10110001
10110010
10110011
10110100
10110101
10110110
10110111
10111000
10111001
10111010
10111011
10111100
10111101
10111110
10111111
CV-22 Advance Consist headlight control
CV -23 Adva nce C onsist acceler ation r ate
CV -24 Adva nce C onsist decelera tion ra te
SEE YOUR DECODER MANUAL FOR
ALL OF THE CVs IT USES AND THE
RANGE OF VALUES.
Binary
Hex
76543210
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
A1
A2
A3
A4
A5
A6
A7
A8
A9
AA
AB
AC
AD
AE
AF
B0
B1
B2
B3
B4
B5
B6
B7
B8
B9
BA
BB
BC
BD
BE
BF
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
11000000
11000001
11000010
11000011
11000100
11000101
11000110
11000111
11001000
11001001
11001010
11001011
11001100
11001101
11001110
11001111
11010000
11010001
11010010
11010011
11010100
11010101
11010110
11010111
11011000
11011001
11011010
11011011
11011100
11011101
11011110
11011111
11100000
11100001
11100010
11100011
11100100
11100101
11100110
11100111
11101000
11101001
11101010
11101011
11101100
11101101
11101110
11101111
11110000
11110001
11110010
11110011
11110100
11110101
11110110
11110111
11111000
11111001
11111010
11111011
11111100
11111101
11111110
11111111
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
DA
DB
DC
DD
DE
DF
E0
E1
E2
E3
E4
E5
E6
E7
E8
E9
EA
EB
EC
ED
EE
EF
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
FA
FB
FC
FD
FE
FF
Bit 1=Speed step 28
Bit 2 =d .c. enable
Bit 3= Advance acknow ledgment
Bit 4 = A lternate sp eed tab le
Bit 5= Lo ng a ddress.
CV -66 Forw ard T rim
CV -67 to 94 Speed T able
CV-95
Reverse Trim
DEF 24April02
CV -29 C onfiguration R egister
Bit 0= Direction of travel
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
1
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
2
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
1
3
3
4
5
6
7
8
9
A
B
C
D
E
F
0
1
2
4
4
5
6
7
8
9
A
B
C
D
E
F
0
1
2
3
5
5
6
7
8
9
A
B
C
D
E
F
0
1
2
3
4
6
6
7
8
9
A
B
C
D
E
F
0
1
2
3
4
5
7
7
8
9
A
B
C
D
E
F
0
1
2
3
4
5
6
8
8
9
A
B
C
D
E
F
0
1
2
3
4
5
6
7
9
9
A
B
C
D
E
F
0
1
2
3
4
5
6
7
8
A
A
B
C
D
E
F
0
1
2
3
4
5
6
7
8
9
B
B
C
D
E
F
0
1
2
3
4
5
6
7
8
9
A
C
C
D
E
F
0
1
2
3
4
5
6
7
8
9
A
B
Tab. 1 – Table d’addition hexadécimale
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Tab. 2 – Correspondance hexadécimal-binaire
D
D
E
F
0
1
2
3
4
5
6
7
8
9
A
B
C
E
E
F
0
1
2
3
4
5
6
7
8
9
A
B
C
D
F
F
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
Hexadecimal Multiplication Table
Examples:
Les registres en ASM
Les registres généraux
32bits
16bits
8bits
Nom
Description
EAX
AX
AH/AL
Accumulateur
Registre d'entrée/sortie ; opérations arithmétiques
EBX
BX
BH/BL
Base
ECX
CX
CH/CL
Compteur
Nombre d'itérations à exécuter dans une boucle. Évalue en
entrée.
EDX
DX
DH/DL
Données
Adresse d'un tampon de données que l'on veut manipuler.
Les registres de segment
16bits
Nom
Description
CS
Code segment
Adresse de segment de la prochaine instruction à exécuter.
DS
Data segment
Adresse du segment des données du programme en cours.
ES
Extra segment
Adresse du segment de son choix.
SS
Stack segment
Adresse du segment de pile.
Les registres d'offset
32bits
16bits
Nom
Description
EIP
IP
Instruction pointer
Offset de la prochaine instruction à exécuter (CS:IP → adresse
absolue). Incrémenté à chaque nouvelle instruction.
ESP
SP
Stack pointer
Offset du sommet de la pile. Ajout d'un mot → décrémenté de 2.
ESI
SI
Source index
Manipulation de chaînes : source.
EDI
DI
Destination index
Manipulation de chaînes : destination.
EBP
BP
Base pointer
Le décalage d'une position dans la pile : ponter sur une donnée.
Les registres des indicateurs (flags)
1bit/32
Nom
Description
CF
Carry Flag
Indicateur de retenue : 1 si l'opération a produit une retenue.
AF
Auxiliary carry Flag
PF
Parity Flag
Indicateur de parité : 1 si le résultat est pair.
ZF
Zero Flag
Indicateur de nullité : 1 si le résultat est nul.
SF
Sign Flag
Indicateur de signe : 1 si le résultat d'une opération sur des nombres signés est
négatif.
IF
Interrupt Flag
Empêche les appels d'interruption lorsqu'il est positionné à 1.
DF
Direction Flag
S'il vaut 1, les chaînes de caractères sont parcourues dans le sens des adresses
décroissantes.
OF
Overflow Flag
En arithmétique signée, indique qu'un débordement s'est produit.
TF
Trap Flag
Positionné à 1 pour exécuter les intructions pas à pas, en appelant INT 1 à chaque
fois. Utile pour débugger.
qaco
Microprocesseur 8086
par A. Oumnad
33
3 L’ASSEMBLEUR NASM
La syntaxe des mnémoniques que nous avons utilisée jusqu’à présent est la syntaxe de
l’assembleur NASM. Rappelons que le rôle de l’assembleur est de convertir le programme
source écrit en mnémonique en codes machines compréhensible par le processeur.
3.1 LES DIRECTIVES DE NASM
Les directives ne sont pas des instructions du 8086, elles sont destinées à l'assembleur
qui les utilise pour savoir de quelle manière il doit travailler.

BITS
Cette directive indique à NASM s'il doit produire un code 16 bits ou un code 32 bits.
Elle est utilisée sous la forme : BITS 16 ou BITS 32

ORG
Cette directive indique à l'assembleur l'adresse à partir de laquelle le programme sera
implanté dans la RAM. Pour les programmes ".com", cette adresse doit être 100h

SEGMENT
Cette directive précise dans quel segment, les instructions ou les données qui la
suivent seront assemblées :
SEGMENT .text
Les instructions ou les données initialisée (par db ou dw) qui suivent cette 'déclaration'
seront placé dans le segment programme (Code segment)
SEGMENT .data
Les données (initialisée) déclarée après cette directive sont placée dans le segment de
données (Data segment)
SEGMENT .bss
Les données déclarées après cette directive seront placées dans le segment de
données mais cette partie est réservée à la déclaration des variables non initialisée.


%INCLUDE
Comme en langage C, cette directive permet d'inclure un fichier source avant la
compilation.
EQU : Définition de constante
mille EQU
1000
Chaque fois que l'assembleur rencontrera la chaîne mille , il la remplacera par le
nombre 1000 (tout simplement).

%DEFINE
La directive %define permet de définir une constante un peut de la même façon que la
directive EQU . La différence subtile est que %define définit une macros qu'on peur
redéfinir dans la suite du programme ce qui n'est pas possible avec EQU .
Microprocesseur 8086
par A. Oumnad
34
3.2 LES PSEUDO INSTRUCTION DE NASM
Les pseudo instructions ne sont pas des instructions du 8086. Elles ne seront donc pas
traduites en langage machine lors de l'assemblage. NASM les interprète et réalise les
fonctions correspondantes. Les pseudo instructions les plus courantes servent à la
déclaration des variables initialisées ou non initialisées, définition de constantes et la
répétition des instructions :

db : (define byte) définit une variable initialisée de 1 octet

dw : (define word) définit une variable initialisée de 2 octets

resb : réserve un octet pour une variable non initialisée

resw : réserve un mot de 2 octets pour une variable non initialisée
3.3 LES EXPRESSIONS
NASM peut évaluer des expressions entre constantes. Les opérateur reconnus sont :
+, - , *
: addition, soustraction et multiplication
/
: division non signée
//
: division signée
%
: modulo non signé
%% : modulo signé
~
: complément logique
&
: ET logique
|
: OU logique
^
: XOR logique
≪
: décalage à gauche
≫
: décalage à droite
x equ
0F00h
mov
ax,(2*x+6)/2
mov
ax,x << 4
mov
ax,(x >> 8)+(x << 4)
mov
ax,x & x >> 4;
>> est prioritaire sur &
mov
ax,x | x >> 4;
>> est prioritaire sur |
Attention, les expressions ne peuvent être utilisés qu’avec des constantes. On ne peut
pas avoir des choses du genre :
MOV AX , DX+2
Jeu d'instruction x86
1
Jeu d'instruction x86
Le jeu d'instructions du x86 a subi de nombreux changements au cours du temps. La plupart d'entre eux ne sont que
des ajouts au jeu d'instruction initial afin d'apporter de nouvelles fonctionnalités.
Jeu d'instruction sur les entiers
Ceci est le jeu d'instruction complet pour les processeurs 8086-8088 et la plupart, si ce n'est toutes ces instructions
sont accessibles en mode 32-bit. Elles opèrent alors sur les registres et valeurs 32 bits (eax, ebx, etc.) en lieu et place
de leur contrepartie en 16 bits (ax, bx, etc.).
Instructions originales des 8086/8088
Nom
Sens
Traduction
Notes
AAA
ASCII Adjust AL after Ajuste le registre AL après addition
Addition
(mode ASCII)
Utilisé avec le codage BCD non compacté
AAD
ASCII Adjust AX after Ajuste le registre AX après division
Division
(mode ASCII)
Utilisé avec le codage BCD non compacté, bogué dans le jeu
d'instruction original, mais « réparé » dans le NEC V20, causant de
nombreuses incompatibilités
AAM
ASCII Adjust AX after Ajuste le registre AX après
Multiplication
multiplication (mode ASCII)
Utilisé avec le codage BCD non compacté
AAS
ASCII Adjust AL after Ajuste le registre AL après soustraction
Subtraction
(mode ASCII)
Utilisé avec le codage BCD non compacté
ADC
Add with Carry
Ajoute deux entiers, plus le drapeau de
retenue
Le résultat remplace le premier opérande
ADD
Add
Ajoute deux entiers
Le résultat remplace le premier opérande
AND
Logical AND
Effectue un ET logique des opérandes
Le résultat remplace le premier opérande
CALL
Call Procedure
Appelle une procédure
CBW
Convert Byte to Word
Convertit un octet en mot
CLC
Clear Carry Flag
Met le drapeau de retenue à zéro
CLD
Clear Direction Flag
Met le drapeau de direction à zéro
CLI
Clear Interrupt Flag
Met le drapeau d'interruption à zéro
CMC
Complement Carry
Flag
Inverse le drapeau de retenue
CMP
Compare
Compare deux entiers (de façon
arithmétique)
Positionne les drapeaux en fonction de la différence entre les
opérandes
CMPSzz Compare Strings
Compare un octet/mot de deux chaînes
Mnémoniques : CMPS, CMPSB, CMPSW
CWD
Convert Word to
Doubleword
Convertit un mot en double mot
Le registre AX est étendu à DX:AX
DAA
Decimal Adjust AL
after Addition
Ajuste le registre AL après addition
(mode décimal)
Utilisé avec le codage BCD compacté
DAS
Decimal Adjust AL
after Subtraction
Ajuste le registre AL après soustraction
(mode décimal)
Utilisé avec le codage BCD compacté
DEC
Decrement by 1
Décrémente un entier
Ôte un de l'opérande
DIV
Unsigned Divide
Divise par un entier non signé
Le dividende est le registre AX/DX:AX, le quotient est écrit dans
AL/AX et le reste dans AH/DX
Le registre AL est étendu à AX
Jeu d'instruction x86
2
ESC
Escape
Utilisé avec l'unité de calcul en virgule flottante
HLT
Halt
Entre en état d'arrêt jusqu'à réception
d'une interruption
Permet de réduire la consommation de puissance du processeur.
Alias : HALT
IDIV
Signed Divide
Divise par un entier signé
Le dividende est le registre AX/DX:AX, le quotient est écrit dans
AL/AX et le reste dans AH/DX
IMUL
Signed Multiply
Multiplie par un entier signé
Le facteur est le registre AL/AX et le produit est écrit dans
AX/DX:AX
IN
Input from Port
Lit depuis un port
La destination est le registre AL/AX
INC
Increment by 1
Incrémente un entier
Ajoute un à l'opérande
INT
Call to Interrupt
Procedure
Appelle l'interruption identifiée par
l'opérande
INTO
Call to Interrupt
Procedure if Overflow
Appelle l'interruption de débordement si
le drapeau de débordement est à un
IRET
Interrupt Return
Revient d'une interruption
Jcc
Jump if Condition Is
Met
Saute si une condition est vérifiée
JMP
Jump
Saute (inconditionnel)
LAHF
Load Flags into AH
Copie le registre des drapeaux dans le
registre AH
LDS
Load DS with Far
Pointer
Charge un pointeur de type far (lointain)
dans le registre DS (segment) et
l'opérande (décalage)
LEA
Load Effective
Address
Charge l'adresse du second opérande
dans le premier
LES
Load ES with Far
Pointer
Charge un pointeur de type far (lointain)
dans le registre ES (segment) et
l'opérande (décalage)
LOCK
Assert LOCK# Signal
Prefix
Préfixe verrouillant les bus pour les
prochaines instructions
Utilisé pour les plates-formes multiprocesseurs.
LODSzz
Load String
Copie un octet/mot d'une chaîne
La destination est le registre AL/AX. Mnémoniques : LODS,
LODSB, LODSW
LOOPcc
Loop According to
Counter
Décrémente le compteur et saute si une
condition est vérifiée
Le compteur est le registre CX. Mnémoniques : LOOP, LOOPE,
LOOPNE, LOOPNZ, LOOPZ
MOV
Move
Copie le second opérande dans le
premier
Mnémoniques : JA, JAE, JB, JBE, JC, JCXZ, JE, JG, JGE, JL, JLE,
JNA, JNAE, JNB, JNBE, JNC, JNE, JNG, JNGE, JNL, JNLE, JNO,
JNP, JNS, JNZ, JO, JP, JPE, JPO, JS, JZ
MOVSzz Move from String to
String
Copie un octet/mot d'une chaîne vers une Mnémoniques : MOVS, MOVSB, MOVSW
autre
MUL
Unsigned Multiply
Multiplie par un entier non signé
Le facteur est le registre AL/AX et le produit est écrit dans
AX/DX:AX
NEG
Two's Complement
Negation
Calcule l'opposé de l'opérande (négation
par complément à deux)
Le résultat remplace l'opérande
NOP
No Operation
Ne fait rien
NOT
One's Complement
Negation
Effectue un NON logique (négation par
complément à un)
Le résultat remplace l'opérande
OR
Logical Inclusive OR
Effectue un OU logique inclusif des
opérandes
Le résultat remplace le premier opérande
Jeu d'instruction x86
3
OUT
Output to Port
Écrit vers un port
La source est le registre AX/AL
POP
Pop a Value from the
Stack
Dépile vers le registre opérande
POPF
Pop Flags Register
from the Stack
Dépile vers le registre des drapeaux
PUSH
Push a Value onto the
Stack
Empile le registre opérande
PUSHF
Push Flags Register
onto the Stack
Empile le registre des drapeaux
RCL
Rotate through Carry
Left
Effectue une rotation à gauche via par le
drapeau de retenue
RCR
Rotate through Carry
Right
Effectue une rotation à droite via par le
drapeau de retenue
REPcc
Repeat String
Operation Prefix
Préfixe de répétition d'une opération sur
une chaîne
RET
Return from Procedure Revient d'une procédure appelée avec
décalage seul
L'adresse de retour (décalage) est sur la pile. Un opérande optionnel
peut indiquer le nombre d'octets supplémentaire à dépiler.
RETF
Return from Far
Procedure
Revient d'une procédure appelée avec
segment et décalage
L'adresse de retour (segment et décalage) est sur la pile. Un
opérande optionnel peut indiquer le nombre d'octets supplémentaire
à dépiler.
ROL
Rotate Left
Effectue une rotation vers la gauche
ROR
Rotate Right
Effectue une rotation vers la droite
SAHF
Store AH into Flags
Copie le registre AH dans le registre des
drapeaux
SAL
Shift Arithmectically
Left
Décalage arithmétique vers la gauche
SALC
Set AL from Carry
Flag
Copie la valeur 0xFF dans le registre AL Initialement non documenté. Alias : SETALC
si CF vaut 1, ou 0x00 sinon
SAR
Shift Arithmectically
Right
Décalage arithmétique vers la droite
À ne pas confondre avec SHR
SBB
Integer Subtraction
with Borrow
Soustrait deux entiers, ajoute le drapeau
de retenue
Le résultat remplace le premier opérande
SCASzz
Scan String
Compare un octet/mot d'une chaîne
La référence est le registre AL/AX. Mnémoniques : SCAS, SCASB,
SCASW
SHL
Shift Left
Décalage logique à gauche
Même instruction que SAL
SHR
Shift Right
Décalage logique à droite
À ne pas confondre avec SAR
STC
Set Carry Flag
Met le drapeau de retenue à un
STD
Set Direction Flag
Met le drapeau de direction à un
STI
Set Interrupt Flag
Met le drapeau d'interruption à un
STOSzz
Store in String
Copie dans un octet/mot d'une chaîne
La source est le registre AL/AX. Mnémoniques : STOS, STOSB,
STOSW
SUB
Subtract
Soustrait deux entiers
Le résultat remplace le premier opérande
TEST
Logical Compare
Compare deux opérandes (de façon
logique)
Positionne les drapeaux en fonction du résultat du ET logique entre
les opérandes
WAIT
Wait
Attend tant que la broche BUSY du
processeur est inactive
Utilisé avec l'unité de calcul en virgule flottante
Mnémoniques : REP, REPE, REPNE, REPNZ, REPZ
Même instruction que SHL
Jeu d'instruction x86
4
XCHG
Exchange
Permute le contenu des deux opérandes
XLAT
Table Look-up
Translation
Translation de donnée entre des tables
Alias : XLATB
XOR
Logical Exclusive OR
Effectue un OU logique exclusif des
opérandes
Le résultat remplace le premier opérande
Ajouts aux processeurs spécifiques
Ajouts aux processeurs 80186/80188
BOUND, ENTER, INSB, INSW, LEAVE, OUTSB, OUTSW, POPA, PUSHA, PUSHW
Ajouts au processeur 80286
ARPL, CLTS, LAR, LGDT, LIDT, LLDT, LMSW, LOADALL, LSL, LTR, SGDT, SIDT, SLDT, SMSW, STR,
VERR, VERW
Ajouts au processeur 80386
BSF, BSR, BT, BTC, BTR, BTS, CDQ, CMPSD, CWDE, INSD, IRETD, IRETDF, IRETF, JECXZ, LFS, LGS,
LSS, LODSD, LOOPD, LOOPED, LOOPNED, LOOPNZD, LOOPZD, MOVSD, MOVSX, MOVZX, OUTSD,
POPAD, POPFD, PUSHAD, PUSHD, PUSHFD, SCASD, SETA, SETAE, SETB, SETBE, SETC, SETE, SETG,
SETGE, SETL, SETLE, SETNA, SETNAE, SETNB, SETNBE, SETNC, SETNE, SETNG, SETNGE, SETNL,
SETNLE, SETNO, SETNP, SETNS, SETNZ, SETO, SETP, SETPE, SETPO, SETS, SETZ, SHLD, SHRD, STOSD
Ajouts au processeur 80486
BSWAP, CMPXCHG, CPUID, INVD, INVLPG, RSM, WBINVD, XADD
Ajouts au processeur Pentium
CMPXCHG8B, RDMSR, RDPMC*, RDTSC, WRMSR
• RDPMC a été introduit avec le processeur Pentium Pro et le processeur Pentium MMX
Ajouts au processeur Pentium Pro
CMOVA, CMOVAE, CMOVB, CMOVB, CMOVE, CMOVG, CMOVGE, CMOVL, CMOVLE, CMOVNA,
CMOVNAE, CMOVNB, CMOVNBE, CMOVNC, CMOVNE, CMOVNG, CMOVNGE, CMOVNL, CMOVNLE,
CMOVNO, CMOVNP, CMOVNS, CMOVNZ, CMOVO, CMOVP, CMOVPE, CMOVPO, CMOVS, CMOVZ,
SYSENTER, SYSEXIT, UD2
Ajouts au processeur AMD K7
• SYSCALL - Fonctionnalité spécifique au processeur AMD équivalente à l'instruction SYSENTER.
• SYSRET - Fonctionnalité spécifique au processeur AMD équivalente à l'instruction SYSEXIT.
Ajouts au processeur Pentium III
Fonctionnalités SSE
MASKMOVQ, MOVNTPS, MOVNTQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
(Mise en cache et ordonnancement mémoire (Memory Ordering))
Guide de référence rapide de l'assembleur x86
Les registres: %eax %ebx %ecx %edx %esi %edi %ebp %esp.
Ils contiennent tous un entier de 32 bits (4 octets), qui peut aussi être vu comme une adresse. Le
registre %esp est spécial, et pointe sur le sommet de pile; il est modifié par les instructions pushl,
popl, call, ret notamment.
Il y a aussi d'autres registres que l'on ne peut pas manipuler directement. (L'instruction info
registers sous gdb ou ddd vous les montrera.) Le plus important est eip, le compteur de
programme: il contient en permanence l'adresse de la prochaine instruction à exécuter. 1em
• addl <source>, <dest>.......<dest>= <dest>+ <source> (addition)
Ex: addl $1, %eax ajoute 1 au registre %eax.
Ex: addl $4, %esp dépile un élément de 4 octets de la pile.
Ex: addl %eax, (%ebx, %edi, 4) ajoute le contenu de %eax à la case mémoire à
l'adresse %ebx + 4*%edi. (Imaginez que %ebx est l'adresse de début d'un tableau a, %edi
est un index i, ceci stocke %eax dans a[i].)
• andl <source>, <dest>.......<dest>= <dest>& <source> (et bit à bit)
• call <dest>.......appel de procédure à l'adresse <dest>
Équivalent à pushl $a, où a est l'adresse juste après l'instruction call (l'adresse de
retour), suivi de jmp <dest>.
Ex: call printf appelle la fonction printf.
Ex: call *%eax (appel indirect) appelle la fonction dont l'adresse est dans le registre
%eax. Noter qu'il y a une irrégularité dans la syntaxe, on écrit call *%eax et non call
(%eax).
• cltd .......conversion 32 bits -> 64 bits
Convertit le nombre 32 bits dans %eax en un nombre sur 64 bits stocké à cheval entre %edx
et %eax.
Note: %eax n'est pas modifié; %edx est mis à 0 si %eax est positif ou nul, à −1 sinon.
À utiliser notamment avant l'instruction idivl.
• cmp <source>, <dest>.......comparaison
Compare les valeurs de <source> et <dest>. Utile juste avant un saut conditionnel (je, jge,
etc.). À noter que la comparaison est faite dans le sens inverse de celui qu'on attendrait. Par
exemple, cmp <source>, <dest> suivi d'un jge (“jump if greater than or equal to”), va
effectuer le saut si <dest>≥<source>: on compare <dest> à <source>, et non le contraire.
• idivl <dest>.......division entière et reste
Divise le nombre 64 bits stocké en %edx et %eax (cf. cltd) par le nombre 32 bits <dest>.
Retourne le quotient en %eax, le reste en %edx.
• imull <source>, <dest>.......multiplie <dest> par <source>, résultat dans
<dest>
• jmp <dest>.......saut inconditionnel: eip=<dest>
• je <dest>.......saut conditionnel
Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que
<dest>=<source>, continue avec le flot normal du programme sinon.
• jg <dest>.......saut conditionnel
Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que
<dest>><source>, continue avec le flot normal du programme sinon.
• jge <dest>.......saut conditionnel
Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que
<dest>≥<source>, continue avec le flot normal du programme sinon.
• jl <dest>.......saut conditionnel
Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que
<dest><<source>, continue avec le flot normal du programme sinon.
• jle <dest>.......saut conditionnel
Saute à l'adresse <dest> si la comparaison précédente (cf. cmp) a conclu que
<dest>≤<source>, continue avec le flot normal du programme sinon.
• leal <source>, <dest>.......chargement d'adresse effective
Au lieu de charger le contenu de <source> dans <dest>, charge l'adresse de <source>.
Équivalent C: <dest>=&<source>.
• movl <source>, <dest>.......transfert
Met le contenu de <source> dans <dest>. Équivalent C: <dest>=<source>.
Ex: movl %esp, %ebp sauvegarde le pointeur de pile %esp dans le registre %ebp.
Ex: movl %eax, 12(%ebp) stocke le contenu de %eax dans les quatre octets
commençant à %ebp+12.
Ex: movl (%ebx, %edi, 4), %eax lit le contenu de la case mémoire à l'adresse
%ebx + 4*%edi, et le met dans %eax. (Imaginez que %ebx est l'adresse de début d'un
tableau a, %edi est un index i, ceci stocke a[i] dans %eax.)
• negl <dest>.......<dest>=-<dest>(opposé)
• notl <dest>.......<dest>=~<dest>(non bit à bit)
• orl <source>, <dest>.......<dest>= <dest>| <source> (ou bit à bit)
• popl <dest>.......dépilement
Dépile un entier 32 bits de la pile et le stocke en <dest>.
Équivalent à movl (%esp),<dest> suivi de addl $4, %esp.
Ex: popl %ebp récupère une ancienne valeur de %ebp sauvegardée sur la pile,
typiquement, par pushl.
• pushl <source>.......empilement
Empile l'entier 32 bits <source> au sommet de la pile.
Équivalent à movl <source>, -4(%esp) suivi de subl $4, %esp.
Ex: pushl %ebp sauvegarde la valeur de %ebp, qui sera rechargée plus tard par popl.
Ex: pushl <source> permet aussi d'empiler les arguments successifs d'une fonction.
(Note: pour appeler une fonction C comme printf par exemple, il faut empiler les
arguments en commençant par celui de droite.)
• ret .......retour de procédure
Dépile une adresse de retour a, et s'y branche. Lorsque la pile est remise dans l'état à l'entrée
d'une procédure f, ceci a pour effet de retourner de f et de continuer l'exécution de la
procédure appelante.
Équivalent à popl eip... si cette instruction existait (il n'y a pas de mode d'adressage
permettant de manipuler eip directement).
• subl <source>, <dest>.......<dest>= <dest>- <source>(soustraction)
Ex: subl $1, %eax retire 1 du registre %eax.
Ex: subl $4, %esp alloue de la place pour un nouvel élément de 4 octets dans la pile.
• xorl <source>, <dest>.......<dest>= <dest>^ <source> (ou exclusif bit à bit)
Microprocesseur 8086
par A. Oumnad
42
5 CODE MACHINE DES INSTRUCTIONS
Une instruction peut comporter de 1 à 7 octets dont 1 ou 2 octets pour coder
l'opération, les autres servent à définir les opérandes.
Dans le cas le plus général, l’instruction se fait entre un registre et une case mémoire.
Dans le code machine de l’instruction, on trouvera le code de l’opération (CO), le code du
registre utilisé (REG), le code du mode d’adressage utilisé (MOD) et le code permettant de
déterminer l’adresse de la case mémoire (ADR):

Le premier octet est un octet optionnel qui représente un préfix qui peut être un
préfix de répétition ou un préfix de changement de segment.

Le 2ème octet dit Code Opération se présente comme suit :
7
6
5
4
3
2
CO
1
0
d
w


CO : C'est le code proprement dit de l'instruction
d : désigne la destination du résultat
d=0 
Résultat dans mémoire ou opération entre 2 registres
d=1 
Résultat dans registre

w : Opération 8 bits ou 16 bits
w=0
8 bits
w=1
16 bits
Le 3ème octet permet de définir les opérandes

7
6
MOD
5
4
REG
3
2
1
0
ADR

MOD : Ce champ de 2 bits nous informe sur le mode d'adressage : registre,
directe ou la nature du déplacement dans les autres cas,

REG :
Ce champ de 3 bits désigne le registre constituant un opérande

ADR :
Ce champs de 3 bits précise l’adresse de l’autre opérande quand il s´agit
d’une position mémoire.

Pour une opération entre deux registres R  R :
REG = Registre source
ADR = Registre destination
Les octets suivants concernent :




Les déplacements sur 8 ou 16 bits utilisés dans le calcul d'adresse
Les donnés sur 8 ou 16 bits dans le cas de l'adressage immédiat
...
Microprocesseur 8086
43
par A. Oumnad
5.1 LES CODES REG, ADR ET MOD
REG
w=1
000
001
010
011
100
101
110
111
00
ES
MOD
ADR
AX
CX
DX
BX
SP
BP
w=0
000
AL
001
CL
010
DL
011
BL
100
AH
101
CH
000
001
010
011
100
101
SI
110
DH
110
DI
111
REG Segment
01
10
CS
SS
BH
111
BX+SI+d
BX+DI+d
BP+SI+d
BP+DI+d
SI+d
DI+d
- BP+d
- Direct
BX+d
00
- Directe
- Indirecte avec dep = 0
Indirect déplacement court :
8 bits, 127, 1 ou 2 chiffres hex
Indirect dép. long : 16 bits,
10
128 , + de 2 chiffres hex
R ← R ou R ← im
11 Dans ce cas :
ADR= code registre destination
01
Préfix de changement de segment
11
DS
ES
26h
CS
2Eh
5.2 TABLEAU DES CODES BINAIRES
AAA
AAD
AAM
AAS
ADC
 R/M  R
 R/M  im
 AL/AX  im
ADD
 R/M  R
 R/M  im (**)
 AL/AX  im
AND
 R/M  R
 R/M  im
 Ac  im
BOUND
CALL
 intra segment direct
 intra segment indirect
 inter segment direct
 inter segment indirect
CBW
CLC
CLD
CLI
CMC
CMP
 R/M  R
 R/M  im
 AL/AX  im
0011 0111
1101 0101
1101 0100
0011 1111
0000 1010
0000 1010
0001 00dw
1000 00sw
0001 010w
MOD REG ADR
MOD 010 ADR
donnée
(Adr ou dep)
(Adr ou dep)
donnée
0000 00dw
1000 00sw
0000 010w
MOD REG ADR
MOD 000 ADR
donnée
(Adr ou dep)
(Adr ou dep)
donnée
0010 00dw
1000 000w
0010 010w
0110 0010
MOD REG ADR
MOD 100 ADR
donnée
MOD REG ADR
(Adr ou dep)
(Adr ou dep)
donnée
1110 1000
1111 1111
1001 1010
adresse
MOD 010 ADR
Adresse
(Adr ou dep)
(Dep)
Segment
1001 1000
1111 1000
1111 1100
1111 1010
1111 0101
0011 10dw
1000 00sw
0011 110w
MOD REG ADR
MOD 111 ADR
Donnée
(Adr ou dep)
(Adr ou dep)
donnée
SS
36h
DS
3Eh
Microprocesseur 8086
44
par A. Oumnad
CMPS
CWD
DAA
DAS
DEC
 R/M 8 bits
 R 16 bits
DIV R/M
ENTER
EDC
HLT
IDIV R/M
IMUL R/M
IN
 Port défini
 Port dans DX
INC
 R/M 8 bits
 R 16 bits
INS
INT
INTO
IRET
JA
JAE
JB
JBE
JC
JCXZ
JE
JG
JGE
JL
JLE
JMP
 intra segment direct
 intra segment direct court
 intra segment indirect
 inter segment direct
 inter segment indirect
1010 011w
1001 1001
0010 0111
0010 1111
JNC
JNE
JNO
JNS
JNP
JO
JP
JS
LAHF
LDS
0111 0011
0111 0101
0111 0001
0111 1001
0111 1011
0111 0000
0111 1010
0111 1000
1001 1111
1100 0101
1111 111w
01001 REG
1111 011w
1100 1000
1111 0100
1111 011w
1111 011w
MOD 001 ADR
(Adr ou dep)
MOD 110 ADR
donnée
(Adr ou dep)
MOD 111 ADR
MOD 101 ADR
(Adr ou dep)
(Adr ou dep)
1110 010w
1110 110w
Port
1111 111w
01000 REG
0110 110w
1100 1101
1100 1110
1100 1111
0111 0111
0111 0011
0111 0010
0111 0110
1110 0010
1110 0011
0111 0100
0111 1111
0111 1101
0111 1100
0111 1110
MOD 000 ADR
1110 1001
1110 1011
1111 1111
1110 1010
1111 1111
(Adr ou dep)
Num. interruption
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
(jmp etiq)
Dep_Relatif_16
Dep_Relatif_8. (jmp short etiq)
MOD 100 ADR
Adr. branch.16
SegL
MOD 101 ADR
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
DepRel_8
MOD REG ADR
(Adr ou dep)
SegH
Microprocesseur 8086
LEA
LEAVE
LES
LOCK
LODS
LOOP
LOOPZ
LOOPNZ
MOV
 R/M  R
 m  im
 R  im
 AX/AL  M_direct
 M_direct  AX/AL
 Rseg  R/M
 R/M  Rseg
MOVS
MUL R/M
NEG
NOP
NOT
OR
 R/M  R
 R/M  im
 AX/AL  im
OUT
 port défini
 port dans DX
OUTS
POP
M
R
 Rseg
POPA (*)
POPF
PUSH
M
R
 Rseg
PUSHA (*)
PUSHF
RCL
 R/M,1
 R/M,CL
 R/M,im8 (*)
RCR
 R/M,1
 R/M,CL
 R/M,im8 (*)
REP/REPZ, REPNZ
45
par A. Oumnad
10001101
11001001
1100 0100
1111 0000
1010 110w
1110 0010
1110 0001
1110 0000
MOD REG ADR
(Adr ou dep)
MOD REG ADR
(Adr ou dep)
DepRel_8
DepRel_8
DepRel_8
1000 10dw
MOD REG ADR (Adr ou dep)
1100 011w
MOD 000 ADR (Adr ou dep)
1011 w REG
donée
1010 000w
Adresse
1010 001w
Adresse
1000 1110 MOD 0 Rseg ADR (Adr ou dep)
1000 1100 MOD 0 Rseg ADR (Adr ou dep)
1010 010w
1111 011w
MOD 100 ADR (Adr ou dep)
1111 011w
MOD 011 ADR (Adr ou dep)
1001 0000
1111 011w
MOD 010 ADR (Adr ou dep)
donnée
0000 10dw
1000 000w
0000 110w
MOD REG ADR
MOD 001 ADR
donnée
1110 011w
1110 111w
0110 111w
port
1000 1111
0101 1REG
000REG111
0100 0001
1001 1101
MOD 000 ADR
(Adr ou dep)
1111 1111
01010 REG
000REG110
0110 0000
1001 1100
MOD 000 ADR
(Adr ou dep)
1101 000w
1101 001w
1100 000w
MOD 010 ADR
MOD 010 ADR
MOD 010 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
1101 000w
1101 001w
1100 000w
1111 001z
MOD 011 ADR
MOD 011 ADR
MOD 011 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
(Adr ou dep)
(Adr ou dep)
donnée
Microprocesseur 8086
RET
 intra segment
 inter segment
ROL
 R/M,1
 R/M,CL
 R/M,im8 (*)
ROR
 R/M,1
 R/M,CL
 R/M,im8 (*)
SAHF
SAL/SHL
 R/M,1
 R/M,CL
 R/M,im8 (*)
SAR
 R/M,1
 R/M,CL
 R/M,im8 (*)
SBB
 R/M  R
 R/M  im
 AL/AX  im (*)
SCAS
SHR
 R/M,1
 R/M,CL
 R/M,im8 (*)
STC
STD
STI
STOS
SUB
 R/M  R
 M  im (**)
 R  im (**)
 AL/AX  im
TEST
 R/M  R
 R/M  im
 AL/AX  im
WAIT
XCHG
 R/M  R
 R  AX
XLAT
XOR • R/M  R
 R/M  im
 AL/AX  im
46
par A. Oumnad
1100 0011
1100 1011
1101 000w
1101 001w
1100 000w
MOD 000 ADR
MOD 000 ADR
MOD 000 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
1101 000w
1101 001w
1100 000w
1001 1110
MOD 001 ADR
MOD 001 ADR
MOD 001 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
1101 000w
1101 001w
1100 000w
MOD 100 ADR
MOD 100 ADR
MOD 100 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
1101 000w
1101 001w
1100 000w
MOD 111 ADR
MOD 111 ADR
MOD 111 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
0001 10dw
1000 00sw
0001 110w
1010 111w
MOD REG ADR
MOD 011 ADR
donnée
(Adr ou dep)
(Adr ou dep)
donnée
1101 000w
1101 001w
1100 000w
1111 1001
1111 1101
1111 1011
1010 101w
MOD 101 ADR
MOD 101 ADR
MOD 101 ADR
(Adr ou dep)
(Adr ou dep)
(Adr ou dep)
Donnée_8
0010 10dw
1000 00sw
1000 00sw
0010 110w
MOD REG ADR
MOD 101 ADR
11 101 REG
donnée
(Adr ou dep)
(Adr ou dep)
donnée
1000 010w
1111 011w
1010 100w
1001 1011
MOD REG ADR
MOD 000 ADR
donnée
(Adr ou dep)
(Adr ou dep)
1000 011w
10010 REG
1101 0111
0011 00dw
1000 000w
0011 010w
MOD REG ADR
(Adr ou dep)
MOD REG ADR
MOD 110 ADR
donnée
(Adr ou dep)
(Adr ou dep)
donnée
donnée
donnée
Microprocesseur 8086



par A. Oumnad
Les champs entre ( ) sont présents dans le cas de l’adressage direct [aaaa] ou de l’adressage
indirect avec déplacement [R+dep] ou [Rb + Ri + dep]
Un champ adresse est toujours constitué de 2 octets : AdrL AdrH
Un champ de donnée peut être de 1 ou de 2 octets selon l’instruction, DL suivie
éventuellement de DH
(*) Ces instructions ne tournent pas sur le 8086 mais sur les processeurs qui l’on suivi
(**) s=1 dans le cas R/M16 ↔ im8, une extension de signe 8 bits vers 16 bits est effectués
sur la donnée immédiate avant l’opération.
Exemples :
mov ax , 3456h
R16 ← im16
1011 w REG donnée
1011 1 000 5634
B8 56 34
mov CL , [BP+SI]
R8 ← M
1000 10dw MOD REG ADR
1000 1010 00
001 010
8A 0A
Mov bx , 56h
R16 ← im16
1011 w REG donnée
1011 1 011 56 00
BB 56 00
Mov bl, 56h
R8 ← im8
1011 w REG donnée
1011 0 011 56
B3 56
Mov DX , [123h]
R16 ← M
1000 10dw MOD REG ADR adresse
1000 1011 00
010 110 2301
8B 16 23 01
Mov AX , BX
R16 ← R16
1000 10dw MOD REG ADR
1000 1001 11
011 000
89 D8
Mov [SI + 146h] , BL
M ← R8
1000 10dw MOD REG ADR deplong
1000 1000 10
011 100 4601
88 9C 46 01
Mov [BX+DI + 46h] , CX
M ← R16
1000 10dw MOD REG ADR depcourt
1000 1001 01
001 001 46
89 49 46
mov AX , [3456h]
AX ← Mdirect
1010 000w adresse
1010 0001 5634
A1 56 34
AND BL , 38h
R8 ← im
1000 000w MOD 100 ADR donée
1000 0000 11 100 011 38
80 E3 38
47
Microprocesseur 8086
35
par A. Oumnad
4 LES ENTREE SORTIES
Pour faire des entrées sorties (essentiellement avec l’écran et le clavier), on passe par
des interruptions du BIOS ou du DOS. Nous n'allons voir ici que ce dont nous avons
besoin.
4.1.1 L'interruption 10h du BIOS
Le BIOS est de relativement bas niveau et dépend fortement de la machine.
L'interruption 10h peut effectuer beaucoup de fonctions différentes, le numéro de la
fonction désirée doit être place dans AH avant l'appel de l'interruption. Nous ne parlerons
ici que de quelques fonctions.

Fonction 00
Cette fonction permet de choisir un mode texte ou un mode graphique. En changeant
de mode, on peut effacer l'écran, ce qui fait que l'on peut appeler cette fonction pour
effacer l'écran et rester dans le même mode.
Paramètres :
AH = 00
AL
mode
00h
01h
02h
03h
04h
05h
06h
07h
0Dh
0Eh
0Fh
10h
11h
12h
13h
T
T
T
T
G
G
G
T
G
G
G
G
G
G
G
Résolution dimensions Résolution
texte
caractère graphique
40x25
9x16
360x400
40x25
9x16
360x400
80x25
9x16
720x400
80x25
9x16
720x400
40x25
8x8
320x200
40x25
8x8
320x200
80x25
8x8
640x200
80x25
9x16
720x400
40x25
8x8
320x200
80x25
8x8
640x200
80x25
8x14
640x350
80x25
8x14
640x350
80x30
8x16
640x480
80x30
8x16
640x480
40x25
8x8
320x200
Couleurs
16
16
16
16
4
4
2
mono
16
16
mono
16
mono
16
256
pages Segment
8
8
8
8
.
.
.
.
8
4
2
.
.
.
.
B800
B800
B800
B800
B800
B800
B800
B000
A000
A000
A000
A000
A000
A000
A000
Tableau 4.1 : modes écran



Pour les modes texte, on peut doubler le nombre de ligne en chargeant un jeux de
caractère de hauteur 8 pixels. Voir fonction 11
Pour ne pas effacer l'écran, placer le bit 7 de AL à 1 (Ajouter 80h)
Fonction 09
couleur
couleur
Cette fonction permet d'écrire un caractère
texte
arrière plan
- Permet les répétitions,
- Gère la couleur en mode texte et en mode
R V B
R V B
graphique,
- Ne gère pas le curseur.
clignotement
brillance
Paramètres :
AH = 09h
Fig. 4.1 : couleur en mode texte
AL = caractère à écrire
BH = page écran
BL = attribut de couleur (RVB :111=Blanc, 000=Noir)
Microprocesseur 8086
par A. Oumnad
36
CX = nombre de fois
Les caractères spéciaux ne sont pas reconnus (le 7 ne fait pas bip). Le bit 7 de la
couleur fait un ou exclusif en mode graphique et un clignotement (uniquement en
mode plein écran) en mode texte.
En mode graphique, l'attribut de couleur ne concerne que le caractère ou le pixel, il
n'agit pas sur la couleur de l'arrière plan. Ceci est valable pour les autres fonctions qui
gèrent la couleur.

Fonction 0Eh
Cette fonction permet d'écrire un caractère,
- Fonctionne en mode graphique,
- Gère le curseur
- Gère la couleur seulement en mode graphique. Seule la couleur du caractère est
gérée, la couleur du fond n’est pas gérée.
paramètres :
AH = 0Eh
AL = code ascii du caractère à écrire
BL = couleur du caractère (mode graphique uniquement).
Les caractères spéciaux sont reconnus :
- 10 (LF : Line Feed ) descend le curseur d'une ligne
- 13 (CR : Carriage Return ) ramène le curseur en début de lignes
- 08 (BS : Back Space ) ramène le curseur d'une position à gauche
- 07 (BEL) fait bip
mov ah,0Eh
mov al,'A'
int 10h

; affiche le caractère A à la position courante du curseur
Fonction 02
Cette fonction permet de positionner le curseur où on le désire, dans la page courante
ou dans une page cachée.
Paramètres :
AH = 02h
BH = numéro de la page
DH = ligne (ordonnée)
DL = colonne (abscisse)
En mode 25x80 les cordonnées vont de (0,0) à (24,79).
Exercice 17) (affcar.asm)
Programme qui place l'écran en mode texte (3) et affiche le caractère A en vert sur bleu à
la position (l=4,c=10)
Exercice 18) (couleurs.asm)
Programme qui place l'écran en mode texte (3) et affiche les 16 premiers caractères de
l'alphabet, chacun sur une line, chacun répété 40 fois et chacun avec une couleur
différente sur fond noir (on commence avec la couleur 0 et on incrémente).
Microprocesseur 8086

37
Fonction 05
Cette fonction permet de sélectionner la page active de l'affichage.
Paramètres :

par A. Oumnad
AH = 05h
AL = numéro de la page
Fonction 11h, sous fonction 12h
Cette fonction permet de charger le jeu de caractère de hauteur 8 pixels pour avoir un
écran de 50 lignes. (Cette fonction doit être appelée après la fonction 00)
Paramètres
AX = 1112h
BL = 30h (08h semble marcher aussi)
Exercice 19) (diag.asm)
Programme qui place l'écran en mode 50 lignes et affiche ensuite l'alphabet (A … Z) en
Diagonal

Fonction 0Ch
: allumer un pixel
AH = 0Ch
BH = 0 (numéro de page)
AL = couleur du pixel
si bit 7 = 1 on trace en mode XOR sauf en mode 256 couleur
CX = x (abscisse)
DX = y (ordonnée)
Exercice 20) (pixel.asm)
Programme qui place l'écran en mode graphique 640x480, 16 couleur et allume le pixel de
coordonnées (200,300) en jaune (14)
4.1.2 L'interruption 21h du DOS
Normalement le DOS est de relativement haut niveau et ne dépend pas de la machine.
Il fait souvent appel au bios qui fonctionne à un niveau plus proche de la machine.
L'interruption 21h peut réaliser plusieurs fonctions différentes. Nous ne citerons ici que
celles que nous utiliserons.

Fonction 02
Cette fonction permet d'écrire un caractère. Le caractère est envoyé vers la sortie
standard, l'écriture peut donc être redirigée dans un fichier.
Paramètres :
AH = 02h
DL = Caractère à écrire

Fonction 09
Cette fonction permet en un seul appel, d'écrire une suite de caractères.
Paramètres :
AH = 09h
DX = Adresse de la chaîne de caractères
La chaîne doit être terminée par le caractère $
Microprocesseur 8086
par A. Oumnad
Remarque : Cette interruption retourne $ dans le registre AL et ceci même si la
documentation officielle affirme le contraire. Donc attention, si vous avez
quelque chose dans AL avant d'appeler cette interruption, ce sera perdu
Exemple : (phrase.asm)
;*********************************************************
; affiche une phrase … l'aide de int21_fct09
;*********************************************************
BITS 16
ORG 0x0100
SEGMENT .data
txt
db 'MON PREMIER PROGRAMME NASM$'
SEGMENT .text
MOV AH,9
MOV DX,txt
INT 21h
MOV AX,4C00h
int 21h
;
;
;
;
fonction 9 de int21
adresse du début de la phrase
écrit la phrase
fin programme
Remarques :
 Pour revenir à la ligne à la fin de la chaîne : ’Bonjour’,10,13 ,’$’
 Si la chaîne contient apostrophe : ’Ecole d’ingénieurs’  ’Ecole d’,39,’ingénieurs$’

Fonction 07
Cette fonction permet de lire un caractère du clavier sans qu'il n'y ait d'écho à l'écran.
Paramètre passé :
AH = 07
Paramètre retourné : AL = caractère lu
Les touches fonction retourne 2 caractères, d'abord un octet nul, puis le code étendu
de la touche, il faut donc faire 2 appels consécutifs de la fonction 07.
Exercice 21) (getchar.asm)
Programme qui :
- Affiche l'invité 'Veuillez taper un caractère'
- Attend l'entrée d'un caractère au clavier
- Affiche sur la ligne suivante 'Voici le caractère tapé ' suivi du caractère

Fonction 0Bh
Cette fonction permet de savoir si un caractère est disponible dans la mémoire tampon
du clavier. Elle est l'équivalente de la fonction kbhit (du C) ou de Keypressed (du
Pascal). Il ne faut pas oublier de vider le buffer par une lecture à l'aide de la fonction
07 ou 08, sinon on risque d'avoir des surprises à la prochaine lecture du clavier.
Paramètre passé :
AH = 0B
Paramètre retourné : AL = 0  aucun caractère n'a été tapé
AL = 255 (-1)  au moins un caractère a été tapé
38
Microprocesseur 8086

39
par A. Oumnad
Fonction 0Ah
Permet de saisir une chaîne de caractère au clavier. La saisie s'arrête quand on tape la
touche  , le caractère CR (13) est mémorisé avec la chaîne
Paramètres :
DX : adresse du buffer (zone mémoire tampon) où seront stockés la longueur de la
chaîne ainsi que la chaîne saisie
[DX] : longueur max. avant d'appeler la fonction, il faut placer dans le premier octet
du buffer la longueur max à ne pas dépasser, il faut compter le CR.
Une fois la saisie terminée, la fonction place dans le deuxième octet du buffer le
nombre de caractère effectivement saisi. La chaîne saisie est placée tous de suite derrière.
On doit placer ici le nombre de caractère max à
saisir, il faut compter le CR
Chaîne saisie
DX doit
pointer ici
la fonction inscrit ici le
nombre de caractères
effectivement lus
0Dh
la fonction inscrit ici
la chaîne saisie
suivie de CR
Tableau 4.2 : illustration de la fonction 0AH de int 21h
Exercice 22) : (gets.asm)
Programme qui permet de saisir une chaîne de moins de 20 caractères et l'affiche ensuite
en diagonale
4.2 ACCES DIRECT A LA MEMOIRE VIDEO
La mémoire vidéo est une zone mémoire qui
B8000
constitue une image de l’écran. Si on écrit quelque
chose dans cette mémoire, elle apparaît à l’écran.
Mémoire
écran
En mode texte, à chaque position de l’écran,
vidéo
correspondent deux positions (octets) de la
mémoire vidéo. Le premier octet correspond au
caractère
attribut
caractère affiché, le deuxième correspond à son
attribut de couleur. La première paire d'octets
représente le caractère en haut à gauche de l'écran
Pour le codage de la couleur, voir int 10h, fonction
09.
La mémoire écran commence à l’adresse B8000h correspondant à l’adresse
Segment:Offset = B800:0000
Si l’écran est configuré en mode 80 caractères par ligne. Chaque ligne correspond à
160 octets dans la mémoire vidéo. Pour écrire un "A" en rouge sur noir à la colonne 20 de
la ligne 10, il faudra écrire ‘A’=65=41h (code ascii de A) à la position 10*160 + 20*2 =
1640 et 04 dans la position suivante. La ligne 0 débute à la position mémoire 0, la ligne 1
Téléchargement