Académique Documents
Professionnel Documents
Culture Documents
Corriction
Corriction
Niveaux de programmation
Niveaux de programmation
circuit logiques 0/1
---------------------------------------------------------------------------------
unit de traitement micro-instructions
(UAL, chemins de donnes) = suite de 0/1
(Unit de commande) micro-pgme
= suite de micro-instructions
------------------------------------------------------------------------------------
Codop
111111 000011101010101 langage machine
= suite de 0/1
------------------------------------------------------------------------------------
ADD A,20 assembleur = remplacer les codop
JZ 13 par des mnmoniques
Djamal Rebane 2
Structure dun programme
assembleur 8086
TITLE nom ; donner un nom au programme
PILE SEGMENT STACK ; dclaration dun segment de pile
; dont le nom est pile
..........
..........
PILE ENDS ; fin de la dclaration de la pile
DONNEE SEGMENT ; dclaration dun segment de donnes qui va
; contenir les variables
...........
DONNEE ENDS ; fin de la dclaration de donnes
LECODE SEGMENT ; dclaration du segment de code qui va contenir
; le code
Debut: ; tiquette dindication du point dentre du code
.................................
LECODE ENDS ; fin de la dclaration du code
END Debut ; fin du point dentre du code
Djamal Rebane 3
Exemple
TITLE prog2.asm: Exemple sur ROL,
Pile segment stack ;
dw 100 dup(?)
Pile ends
DATA segment
DATA1DW 5F97H
COMPTE DB ?
DATA ends
CODE segment
MAIN:
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS, AX
XOR BL, BL ; Mettre BL 0 (ou bien SUB)
MOV DL, 16 ; rotation 16 fois
MOV AX, DATA1
ENCORE: ROL AX, 1 ; Rotation a gauche (a droite aussi si on prfre)
JNC PROCHAIN ; Test si CF=0
INC BL ; Si CF = 1, incrmenter le compteur du nombre de 1
PROCHAIN: DEC DL ; rpter 16 fois
JNZ ENCORE ; encore une fois si ce nest pas fini
MOV COMPTE, BL ; sauvegarder le rsultat dans la case mmoire COMPTE
En pratique aujourd'hui
- Permet de sparer clairement des zones mmoires selon
leur rle
Djamal Rebane 5
Suite
Adressage sur 20 bits avec 2 registres
2 registres 16 bits : peut coder adresses sur 32 bits
Pour uniquement 20 bits
- Dcale le premier registre de 4 bits et l'additionne au
second
- Adresse note A:B
- Adresse relle : A * 16 + B
Exemple (les nombres sont en hexa)
3100:27EE correspond l'adresse 31000 + 27EE = 337EE
Dcaler de 4 bits en binaire revient dcaler d'un chiffre
en hexa
Djamal Rebane 6
Suite 2
Nous avons 4 segments d'adresses : CS, DS, SS, ES
utiliser 2 registres pour adresser des mots mmoires
- Le premier est le registre de segment
- Le second un registre gnral
On l'appelle l'offset (dcalage)
Addresse : segment:offset
Exemples
- CS:IP : adresse de la prochaine instruction excuter
- DS:SI : adresse d'une donne
- SS:SP : adresse du haut de la pile
Djamal Rebane 7
Vos programme sources, crits en
assembleur, doivent avoir lextension
Djamal Rebane 8
Dclaration de variables
Les variables se dclarent de la manire suivante:
datas1 db ? ; datas1 est un byte non initialis
datas2 db 0FFh ; datas2 est un byte initialis FF (255 en hexadcimal)
datas3 dw ? ; datas3 est un word (16 bits)
datas4 db 5 dup (?) ; datas4 est un tableau de 5 bytes non initialiss
datas5 dw 10 dup (15) ; datas5 est un tableau de 10 byte initialiss 15
De manire gnrale:
DB : 1 byte (8 bits) (Declare Byte)
DW : 1 word (16 bits) (Declare Word)
DD : 2 words (32 bits) (Declare Double)
DF,DP : 6 bytes
DQ : 8 bytes (64 bits)
DT : 10 bytes
Les constantes peuvent tre crites en:
- dcimal: 1, 2, 3, 123, 45
- hexadcimal : 1h,2h,3h,12h,0Fh,0AD4h (noter la prsence du 0 quand le le premier
chiffre du nombre en hexadcimal commence par une lettre)
- binaire : 1b,0b,1010b,111101b
Djamal Rebane 9
Les entres Sorties en assembleur
Pour raliser les oprations standards (affichage, saisie), le systme
dexploitation (ici DOS) fournit les fonctions pr-crites suivantes:
Djamal Rebane 10
Saisie dun caractre mov AH, 7; fonction no. 7
(sans cho) int 21h ; rsultat dans AL
Djamal Rebane 11
Lquivalent de quelques instructions du langage C
en assembleur
Djamal Rebane 12
Instruction i
FAUX VRAI
Instruction i Condition ?
Si condition alors
Instructions j
Sinon
Instruction m Instructions m Instructions j
Fin si
Instructions k
Instructions k
Djamal Rebane 13
La boucle FOR Assembleur
For (k=0; k<=10; k++) MOV BX,0
bx = bx + k; MOV CX,0
For: CMP CX,10
JA Endfor
ADD BX,CX
INC CX
JMP For
Endfor:
Djamal Rebane 14
WHILE Assembleur
bx = 5 MOV BX,5
while (bx >0) while: CMP BX,0
bx = bx -1; JLE Endwhile
DEC BX
JMP while
Endwhile:
Djamal Rebane 15
SWITCH Assembleur
switch (n) { CMP n,1
case 1: ....; break; JNE case2
case 2: .....; break; ............
default: .....; JMP endswitch
} case2: CMP n,2
JNE default
..........
JMP endswitch
default: ...........
endswitch: ...........
Djamal Rebane 16
crire le code de linstruction En assembleur
if (a>b) && (c <= d) if: cmp a, b
{ jng endif
................
} cmp c, d
jnle endif
..............
endif:
} }
Djamal Rebane 17
Liste des registres les plus utiliss
A. Registres gnraux
AX (A pour accumulateur): joue le rle doprande implicite dans
plusieurs oprations: MUL, DIV, INC, etc.
CX (C pour compteur): est utilis pour les boucles (instruction
LOOP).
DX: utilis dans les multiplications et divisions comme registre
dextension.
SI (Source Index): souvent utilis comme pointeur sur une adresse
mmoire (exemple: MOV AL, [SI]). Il est trs utilise avec les
instructions de traitement de chanes de caractres (LODS).
DI (Destination Index): pareil que SI (instruction STOS)
BP (base pointeur): sert de pointeur sur la base de la pile, et permet
datteindre nimporte quel lment de la pile (exemple:
MOV AX,[BP+2]).
SP (Stack pointer): pointe sur le sommet de la pile; son contenu est
automatiquement chang par les instructions PUSH et POP.
Djamal Rebane 18
B. Registres spciaux
IP (Instruction pointeur): contient ladresse de linstruction qui suit
celle qui est en cours dexcution.
DS (Data Segment): Pointe sur le dbut du segment qui contient
les donnes
CS (Code Segment): Pointe sur le segment qui contient le code du
programme.
ES (Extended Segment) : permet de pointer sur un segment
supplmentaire dfini par le programmeur. Il se charge par
lintermdiaire de AX, comme pour DS.
SS (Stack Segment): segment contenant la pile.
Djamal Rebane 19
Djamal Rebane 20
Format standard dune instruction
Label: Mnmonique Oprandes ;commentaire
Djamal Rebane 21
Mnmonique (des instructions): il sert
identifier une instruction donne. Quelques
instructions de base sont rsumes dans la
prochaine section.
Oprandes: une instruction assembleur peut
avoir de 0 3 oprandes. Chaque oprande
peut tre le nom dun registre, un oprande
mmoire, une expression constante ou le nom
dun priphrique entre/sortie.
Commentaire: prcd du point-virgule (;). Il
sert ajouter des informations explicatives au
sujet du fonctionnement du programme ou de
linstruction correspondante.
Djamal Rebane 22
Quelques instructions de base-1
Affectations
; Registres <-- Valeurs
MOV AX, 65535 ; (dcimal)
MOV Cl, 01101b ; (binaire)
MOV DH, 0FAh ; (hexa)
; Entre registres
MOV AX, BX
MOV CL, DH
; Entre Registres et Variables
MOV CX, variable_de_deux_octets
MOV variable_de_un_octet, DL
;Registres <-- Adresses Mmoire
Mov AX, Offset variable ; AX <- adresse de variable
Mov CX, [ 5Ah ] ; CX <- valeur l'adresse 5A en hexa
Djamal Rebane 23
Quelques instructions de base- 2
Arithmtique
; Incrmentation
INC AX ; AX <- AX + 1
Inc ma_variable
; Dcrmentation
DEC AX
Dec ma_variable
; Addition
ADD AX, 5 ; AX <- AX + 5
ADD BH, toto ; BH <- BH + toto
Add toto, Cx ; toto <- toto + Cx
; Soustraction
SUB AX, 5 ; AX <- AX 5
SUB BH, toto ; BH <- BH toto
SUB toto, CX ; toto <- toto - CX
Djamal Rebane 24
Quelques instructions de base-3
Logique
; AND bit bit
MOV AH, 0101b ; AH <- 5
MOV BH, 1001b ; BH <- 9
AND AH, BH ; AH <- AH AND BH; AH vaut 0001b, soit 1
; OR bit bit
MOV AH, 0101b ; AH <- 5
MOV BH, 1001b ; BH <- 9
Or AH, BH ; AH <- AH OR BH; AH vaut 1101b, soit 13 (8+4+1)
; XOR bit bit
MOV AH, 0101b ; AH <- 5
MOV BH, 1001b ; BH <- 9
XOR Ah, BH ; AH <- AH XOR BH; AH vaut 1100b, soit 12 (8+4)
; NOT bit bit
MOV AH, 0101b ; AH <- 5 Not AH ; AH <- NOT AH; AH vaut 1010b, soit 10
(8+2)
Djamal Rebane 25
Quelques instructions de base-4
Comparaisons :
Toutes les comparaisons se font l'aide de l'instruction CMP.
On utilise ensuite les instructions de saut conditionnel:
Jump if Equal,
JMP if Greater, ...
Il faut dfinir des labels (tiquettes): les endroits dans le programme o va sauter si
le test est vrifi (comme les GOTO en Fortran).
; Egalit (Jump if Equal)
CMP AX, 5
JE label_1
; Diffrence (Jump if Not Equal)
CMP AX, ma_variable
JNE label_2
;Infrieur, Suprieur, Inf. ou gal, Sup. ou gal
; (Jump if Lower, Greater, Lower or Equal, Greater or Equal)
CMP CH, 0
JL label_1
CMP DH, Ah
JG label_2
CMP AL, 01001b
JLE label_3
Djamal Rebane 26
CMP variable, 65
JGE label_4
Label_1: instructions...
Label_2: instructions...
Label_3: instructions...
Label_4: instructions...
; Saut non conditionnel :
JMP label_1
Djamal Rebane 27
Djamal Rebane 28
JZ Saut si zro. JNZ
JE Saut si gal. ZF = 1 JNE
JC Saut si Retenue (infrieur). JNC
JB Saut si infrieur. JNB
JNAE Saut si ni suprieur ni gal. CF = 1 JAE
JS Saut si signe ngatif. SF = 1 JNS
JO Saut si dbordement. OF = 1 JNO
JPE Saut si parit paire.
JP Saut si parit. PF = 1 JPO
JNZ Saut si pas zro. JZ
JNE Saut si diffrent. ZF = 0 JE
JNC Saut si pas de retenue. JC
JNB Saut si pas infrieur. JB
JAE Saut si suprieur ou gal. CF = 0 JNAE
JNS Saut si aucun signe (positif). SF = 0 JS
JNO Saut si pas de dbordement. OF = 0 JO
JPO Saut si parit impaire. JPE
Djamal Rebane 29
JNP Saut si pas de parit. PF = 0 JP
Modes dadressage
Un mode d'adressage est un moyen qui permet au
microprocesseur d'avoir accs une donne.
Cette donne peut tre un nombre quelconque
dont on aura besoin dans le programme, un
nombre qui se trouve dj dans un registre, ou
encore un nombre qui se trouve crit quelque
part en mmoire.
La connaissance des principaux modes
d'adressage est ncessaire car elle permet
d'crire les programmes de la faon la plus
courte, la plus simple et la plus lisible possible.
Djamal Rebane 30
Modes dadressage
Mode immdiat
Loprande est code avec linstruction
mov AX, 568
Mode registre
Loprande est un registre de donne ou dadresse
mov AX,BX
Mode mmoire direct
Loprande est dsign par ladresse donne dans linstruction
mov [0hC040],AL
mov DS :[0hC040],AL
mov CS:var2,AX
mais pas
mov 0hFE15 :var2,AX
Djamal Rebane 31
Modes dadressage pour
accder aux donnes
Mode mmoire indirect
Loprande est dsigne par une adresse place dans les
registres dadresses donne dans linstruction
mov AX,[SI] BX,BP,SI,DI peuvent servir de registre
pointeur
1. Indirect avec dplacement
Ladresse = contenu du registre dadresse + dplacement
(le registre dadresse nest pas modifi)
mov AX, [DI]
mov BX,[DI+6]
Djamal Rebane 32
Modes dadressage pour
accder aux donnes
2. Indirect avec index
Ladresse = contenu du registre dadresse
+ contenu du registre dindex (le registre
dadresse nest pas modifi)
mov [BP][DI],AX
les couples possibles sont BP-DI,
BP-SI, BX-DI, BX-SI
Djamal Rebane 33
Quelques notes utiles
La dclaration dune chane de caractres est mise en
'' '' ou ' ' .
Le caractre '$' indique la fin dune chane de caractres. Son
omission implique que les octets en mmoire qui viennent
aprs cette chane sont aussi affichs comme des caractres.
Lassembleur ne fait pas de diffrence entre une majuscule et
une minuscule dans lcriture de ses instructions et la
notation des registres.
La directive ASSUME permet d'indiquer l'assembleur o se
situe le segment de donnes et le segment de code. Puis il
s'agit d'initialiser le segment de donnes lintrieur du
segment de code:
MOV AX, nom_du_segment_de_donnees
MOV DS, AX
Djamal Rebane 34
Un petit mot sur linstruction
de transfert
MOV reg, reg (registre registre)
reg, mem (registre mmoire)
mem, reg (mmoire registre)
reg, imed (registre valeur)
mem, imed (mmoire valeur)
Djamal Rebane 35
Applications de quelques
instructions sur des exemples
Djamal Rebane 36
Instruction CMP (Comparer) CMP destination, source Compar C ZF
e F
Oprand
Linstruction CMP affecte les indicateurs AF, OF, SF, PF, CF et ZF es
mais seuls CF et ZF sont utiliss.
Dest. > 0 0
Loprande destination peut tre dans un registre ou dans une mmoire. Src.
Loprande source peut tre dans un registre, dans une mmoire, ou en mode immdiat.
Les oprandes (destination et source) ne changent pas. Dest. = 0 1
Src.
DATA1 DW 235FH
Dest. < 1 0
MOV BX, 7888H ; 7888Hh BX
Src.
MOV CX, 9FFFH
CMP BX, CX ; BX < CX CF=1 JNC est excute PASSE
JNC PASSE ; Note: les contenus de (BX, et CX) ne changent pas aprs CMP
ADD BX, 4000H
PASSE: ADD CX, DATA1 ; mais CF est toujours vrifi pour (< ou >). Pour (=) on utilise ZF.
TEMP DB ?
Djamal Rebane 37
prog1.asm: Exemple sur CMP, Trouver loctet le plus grand parmi 5 notes dlves
PILE segment stack
dw 128 dup(?)
PILE ends
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
DATA segment
Tab DB 45, 20, 40, 30, 25, 15, 5, 35, 95, 50, 90, 10, 80
TTM1 DW 12
DATA ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE segment
main:
assume CS:CODE, DS:data ; gnration de ladresse du segment de code et de donnes
MOV AX, DATA ; Initialiser le registre DS pour rcuprer ladresse du segment de donne
MOV DS, AX
MOV CX, 13 ; compteur de boucle
MOV BX, OFFSET Tab ; BX pointe vers les donnes NOTES
XOR AL, AL ; Initialise AL 0; va hberger la plus grande note
suivant: CMP AL, [BX] ; compare la note prochaine a la note la plus leve
JA PROCHAIN ; Sauter si AL est encore la note la plus leve
MOV AL, [BX] ; sinon AL retient la plus leve
PROCHAIN: INC BX ; pointe vers la prochaine note
LOOP suivant ; CX dcrmente jusqu 0 pour sortir de la LOOP
MOV TTM1, AL ; sauvegarde de la note la plus leve dans PLUS_G
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
MOV AH, 4Ch
INT 21h
MAIN ENDS
END MAIN
Djamal Rebane 38
TITLE prog1.asm: Exemple sur CMP, Trouver loctet le plus grand parmi 5 notes dlves
PILE segment stack
dw 100 dup(?)
PILE ends
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
DATA segment
NOTES DB 18, 06, 19, 11, 08
PLUS_G DB ?
DATA ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE segment
main:
assume CS:CODE, DS:data ; gnration de ladresse du segment de code et de donnes
MOV AX, DATA ; Initialiser le registre DS pour rcuprer ladresse du segment de donne
MOV DS, AX
MOV CX, 5 ; compteur de boucle
MOV BX, OFFSET NOTES ; BX pointe vers les donnes NOTES
XOR AL, AL ; Initialise AL 0; va hberger la plus grande note
ENCORE: CMP AL, [BX] ; compare la note prochaine a la note la plus leve
JA PROCHAIN ; Sauter si AL est encore la note la plus leve
MOV AL, [BX] ; sinon AL retient la plus leve
PROCHAIN: INC BX ; pointe vers la prochaine note
LOOP ENCORE ; CX dcrmente jusqu 0 pour sortir de la LOOP
MOV PLUS_G, AL ; sauvegarde de la note la plus leve dans PLUS_G
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
MOV AH, 4Ch
INT 21h
MAIN ENDS
END MAIN
Djamal Rebane 39
TITLE prog2.asm: Exemple sur ROL, Trouver le nombre de 1 dans un mot
Pile segment stack ; dclaration dun segment de pile pas ncessaire dans notre cas
dw 100 dup(?)
Pile ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------
DATA segment
DATA1DW 5F97H
COMPTE DB ?
DATA ends
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE segment
MAIN:
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS, AX
XOR BL, BL ; Mettre BL 0 (ou bien SUB)
MOV DL, 16 ; rotation 16 fois
MOV AX, DATA1
ENCORE: ROL AX, 1 ; Rotation a gauche (a droite aussi si on prfre)
JNC PROCHAIN ; Test si CF=0
INC BL ; Si CF = 1, incrmenter le compteur du nombre de 1
PROCHAIN: DEC DL ; rpter 16 fois
JNZ ENCORE ; encore une fois si ce nest pas fini
MOV COMPTE, BL ; sauvegarder le rsultat dans la case mmoire COMPTE
;------------------------------------------------------------------------------------------------------------------------------------------------------------
MOV AH, 4Ch
INT 21h
MAIN ENDS
END MAIN
Djamal Rebane 40
Quelques explications
Litration: On peut galement transcrire une boucle laide de
linstruction LOOP ncessitant lutilisation implicite du registre CX.
MOV CX, unevaleur
Boucle:
; le corps de la boucle
LOOP Boucle
Cela signifie que le corps de la boucle est excut tant que la valeur
de CX nest pas nulle. A chaque itration, CX est dcrment dune
unit.
Attention: si CX est nul au premier tour, alors il dcrment et sa
valeur devient 65535, et on va attendre un bon bout de temps pour
arriver la valeur nulle et sortir de la boucle
Djamal Rebane 41
for (cx=5; cx>0; cx--)
ax = ax + cx
MOV AX,0
MOV CX,5 ; CX est le compteur de boucle
for:
ADD AX,CX ; fait le calcul
LOOP for ; dcrmente dune unit CX.
; si CX > 0 fait le saut for
Djamal Rebane 42
On peut aussi utiliser LOOPE/LOOPZ/LOOPNE/LOOPNZ
pour signifier :
Djamal Rebane 43
Buffer DB 8 DUP(0)
..
Boucle:
Djamal Rebane 44
Dcalage et rotation
SHL (Shift Left; SHR: shift right): effectue un dcalage gauche des bits. Si le deuxime
oprande est une valeur, alors seule la valeur 1 est accepte. Le bit de poids fort
se retrouve dans CF; un 0 est introduit dans le bit de poids faible.
SHL AL, 1
Une faon plus lgante consiste utiliser CL dans son rle de compteur:
MOV CL, 4
SHL AX,CX
Pareil pour les instructions SAR, ROR, RCR et leurs quivalents gauche.
Djamal Rebane 45
Manipulation de donnes
1. Operateur offset: renvoie ladresse laquelle est situe un label de donne
Exemple:
Bval db ?
Wval1 dw ?
Wval2 dd ?
Si Bval se trouve ladresse offset 00404000 (hexa), loprateur offset renvoie les
valeurs suivantes:
MOV AX, offset bval ; AX = 00404000
MOV AX, offset Wval1 ; AX = 00404001
MOV AX, offset Wval2 ; AX = 00404002
Djamal Rebane 46
Un mot sur les macros
Djamal Rebane 47
Les macros, la diffrence des procdures, nont aucune
signification pour la machine. Seul lassembleur
comprend leur signification. Elles ne sont quun artifice mis
la disposition du programmeur pour clarifier son
programme. Lorsque lassembleur rencontre le nom dune
macro dans votre code, il le remplace par le code de la
macro. Tout se passe exactement comme si vous aviez
tap vous-mme ce code la place du nom de la macro.
Djamal Rebane 48
Voici comment crire une macro :
Djamal Rebane 49
affiche macro chaine
; sauvegarder le contenu de DX, par
; exemple, en utilisant la pile
push dx ; sauvegarde de dx dans la pile
mov dx,offset chaine
mov ah, 09h
int 21h
pop dx ; restauration de dx
endm ;fin de la macro
Djamal Rebane 50
Lassembleur se chargera alors de la remplacer
par les instructions comprises entre la premire
et la dernire ligne de cet exemple, en prenant
le soin de remplacer le mot chaine par le
message fourni en paramtre.
Supposons prsent que lon veuille crire
lcran le message Coucou ! Ceci est un essai
et revenir la ligne laide de notre macro
affiche
La syntaxe suivante :
affiche Coucou ! Ceci est un essai !, 10, 13, $
10, 13 est lquivalent de endln en C-C++
Djamal Rebane 51
Prsentation dautres exemples
Djamal Rebane 52
TITLE ex3_somme; somme de deux nombres
PILE SEGMENT STACK; dclaration de pile.
; Pour cet exemple, la pile nest pas ncessaire.
INT 21h
ENDM; fin de la macro
Djamal Rebane 53
SCODE SEGMENT ; zone de code
ASSUME CS:SCODE, DS:DATA ; gnration de ladresse du segment de
code et de donnes
DEBUT: ; entre du code
MOV AX, DATA ; Initialiser le registre DS pour rcuprer ladresse du
MOV DS, AX ; segment de donne
Djamal Rebane 54
affiche aff_resu; appel de la macro pour afficher un message sur cran
SUB val2,30h ; les valeurs lues tantt sont en ascii; exemple :
; si on tape les valeurs 1 et 2,
; le programme rcupre 31 et 32, valeurs
; hexadcimales des caractres 1 et 2.
; Donc 31 + 32 = 63. et 63 nest pas la valeur hexa
; du caractre 3. Sa valeur est 33
; autrement dit, on doit retirer 30 en hexa ou 48 en
; dcimal.
MOV AH,2 ; afficher la valeur saisie grce la fonction 2
INT 21h ; qui affiche le contenu de DL
MOV DL,val2
MOV AH, 4Ch ; on termine le programme avec la fonction
MOV AL, 0 ; 4c en hexa. On place une valeur >=0 pour dire
Djamal Rebane 56
SCODE SEGMENT
ASSUME CS:SCODE, DS:DATA ; gnration d,adresses pour les segments de code et de
donnes
DEBUT: ; entre du code
; Initialiser le registre DS par ladresse du segment de donne gnre par
; la directive ASSUME
MOV AX, DATA
MOV DS, AX
Djamal Rebane 57
MOV DL,val1
JMP sortie
grand: MOV DL,val2
sortie: MOV temp,DL
affiche aff_resu ; afficher un message
MOV DL temp; ces trois instructions servent
; afficher le contenu du registre dl
MOV AH,2
INT 21h
; Terminer le programme en retournant vers le DOS
MOV AH, 4Ch
MOV AL, 0
INT 21h
SCODE ENDS ; fin du segment de code
END DEBUT ; fin de lentre du code
Djamal Rebane 58
Exemple 5: que fait cette portion de code?
Djamal Rebane 59
Exemple 6 : que fait la portion de code ci-dessous ?
Djamal Rebane 60
TITLE sommedetroixnombres ; ce programme fait la somme des trois
premiers nombres entiers i.e : 1+2+3
PILE SEGMENT STACK
DW 100 DUP (?)
PILE ENDS
affiche macro chaine; dclaration de macro
mov dx,offset chaine
mov ah, 09h
int 21h
endm; fin de la macro
DATA SEGMENT
temp db 0
val1 db 3
val db 0
aff_resu db 10,13,'la somme des termes jusqu a 3 est:',32,'$' ; $
caractre de fin de chane
DATA ENDS
Djamal Rebane 61
SCODE SEGMENT
ASSUME CS:SCODE, DS:DATA
DEBUT: ; Initialiser le registre DS
MOV AX, DATA
MOV DS, AX
MOV AX,0
so:
CMP AH,val1
JGE psorte
INC AH
ADD AL,AH
JMP so
psorte: ADD AL,30h
MOV temp,AL
affiche aff_resu; affichage laide de la macro
MOV AL,temp
MOV DL, AL
MOV AH,2 ; afficher la valeur saisie
INT 21h
; Terminer le programme
MOV AH, 4Ch
MOV AL, 0
INT 21h
SCODE ENDS
END DEBUT
Djamal Rebane 62
Exemple 7: Exemple sur ROL, Trouver le
nombre de 0 dans un double-mot
Djamal Rebane 63
TITLE programme.asm: Exemple sur ROL, Trouver le nombre de 0 dans un double-mot
PILESEGMENT STACK
DW 100 DUP (?)
PILEENDS
DATA SEGMENT
DATA1 DD 0ABCD5F97H
COMPTE DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:SCODE, DS:DATA ; Initialiser le registre DS
MOV AX, DATA
MOV DS, AX
XOR CX, CX ; Mettre CX 0 (ou bien SUB)
MOV DX, 1010h ; mettre 16 dans DH et DL; 00010000 000010000 en binaire
MOV AX, WORD PTR DATA1 ; pointer vers le premier mot
MOV BX, WORD PTR DATA1 + 2 ; pointe vers le deuxime mot
ENCORE1: ROL AX, 1 ; Rotation gauche ( droite aussi si on prfre)
JC PROCHAIN1 Test si CF=1
INC CL ; Si CF = 0, incrmenter le compteur du nombre de 0
PROCHAIN1: DEC DL ; rpter 16 fois
JNZ ENCORE1 ; encore une fois si ce nest pas fini
MOV AL, CL ; sauvegarder le rsultat dans AL, en sortant de la boucle, le contenu de AX
; nous importe peu, donc en crasant le premier mot nest pas grave
ENCORE2: ROL BX, 1 ; Rotation gauche
JC PROCHAIN2 ; Test si CF=1
INC CH ; Si CF = 0, incrmenter le compteur du nombre de 0
PROCHAIN2: DEC DH ; rpter 16 fois
JNZ ENCORE2 ; encore une fois si ce nest pas fini
MOV AH, CH; sauvegarder le rsultat dans AH. Mme remarque quen haut
ADD AH, AL ; Additionner les nombres de 0 trouvs sparment dans les 2 mots
MOV COMPTE, AH ; et sauvegarder le rsultat dans COMPTE
MOV AH, 4Ch ; retour au DOS
INT 21h
Code ENDS
END MAIN
Djamal Rebane 64
Conversion Minuscule en
Majuscule
L Hex Binaire L Hex Binaire
A 41 01000001 a 61 01100001
B 42 01000010 b 62 01100010
. .
. .
Y 59 01011001 y 79 01111001
Z 5A 01011010 z 7A 01111010
Djamal Rebane 65
TITLE prog8.asm ; Conversion MINUSCULE MAJUSCULE dun texte
PILE SEGMENT STACK
DW 100 DUP (?)
PILE ENDS
DATA SEGMENT
TEXTE1 DB mOn Nom eST REBainE, 13,10, $
TEXTE2 DB 21 DUP(?)
;------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE SEGMENT
ASSUME CS:SCODE, DS:DATA
; Initialiser le registre DS
MOV AX, DATA MOV DS, AX MAIN :
MOV SI, OFFSET TEXTE1 ; SI pointe sur le texte original
MOV BX, OFFSET TEXTE2 ; BX pointe sur le texte en MAJUSCULE
MOV CX, 21 ; compteur de boucle
ARRIERE: MOV AL, byte ptr t[SI] ; prochain caractre
CMP AL, 61H ; Si < a (61H est le code ASCII de a)
JB PASSE ; donc pas besoin de convertir
CMP AL, 7AH ; Si > z (7AH est le code ASCII de z)
JA PASSE ; donc pas besoin de convertir
AND AL, 11011111B ; masque le bit 5 pour convertir en MAJUSCULE
PASSE: MOV [BX], AL ; sauvegarde le caractre MAJUSCULE
INC SI ; incrmente le pointeur vers le texte original
INC BX ; incrmente le pointeur vers le texte en MAJUSCULE
LOOP ARRIERE ; Continuer boucler tant que CX > 0
;------------------------------------------------------------------------------------------------------------------------------------------------------------
MOV AX, 4C00h
INT 21h
CODE ENDS
END MAIN
Djamal Rebane 66
Exemple 9: lit une chane de caractres et
laffiche lenvers
Programme palin
Djamal Rebane 67
title palin
pile segment stack
dw 100 dup(?)
pile ends
data segment
reponse db 255 dup('$')
enter db 10,13,'$ ; endln en C++
temp db 0
data ends
scode segment
assume cs:scode, ds:data
entree:
mov ax,data
mov ds,ax
; on crit le code partir de l
mov dx,offset reponse
mov ah,0ah ; lecture partir du clavier dune chane de caractres
;qui se termine ds quon tape le retour chariot (touche entre)
int 21h
mov si,dx
mov cx,si
Djamal Rebane 68
Deb: cmp BL,0dh; comparer la touche entre 13 en ascii car la fin de reponse contient ce caractre
je finsearch
inc SI
mov BL,byte ptr[si]
jmp deb
finsearch:
dec SI
inc CX
mov DX,offset enter
mov AH,09h
int 21h
fs:
cmp SI,CX
je fin_s
mov DL,byte ptr[si]
mov AH,02h
int 21h
dec SI
jmp fs
fin_s:
mov ax,4c00h
int 21h
scode ends
end Deb
Djamal Rebane 69
Une autre manire de le faire
;debut:
xor dx,dx
mov DL,[si+1] ; rcupration du nombre de caractres lus
; la taille rcuprer est obtenue par lobjet de destination
; car [si+1] na pas de taille spcifique donc obligation de la
; rcuprer avec la destination
; ici DL donc rcupration de 8bits ; si DX rcupration de 16bits
; la destination dcide de la taille rcuprer
mov si,dx
inc si
mov cx,1
f_s:
cmp si,cx
jle fin_s
mov dl,reponse[si]
mov ah,02h
int 21h
dec si
jmp f_s
fin_s:
mov ax,4c00h
int 21h
scode ends
end
Djamal Rebane 70
Une troisime manire de le faire
debut:
xor DX,DX
mov DX,reponse[si] ; rcuperation du nombre de caractres lus
; la taille rcuprer est obtenue par lobjet de destination
; ici DL donc rcupration de 8bits si DX rcupration de 16bits
; la destination dcide de la taille rcuprer
mov SI,DX
inc SI
mov CX,1
fs:
cmp SI,CX
jle fins
mov DL,reponse[si]
mov AH,02h
int 21h
dec SI
jmp fs
fins:
mov AX,4c00h
int 21h
scode ends
end
Djamal Rebane 71
MULTIPLICATION ET DIVISION SIGNE (IMUL / IDIV) reg.
(ou mm.)
Note: Dans les manuels dIntel IMUL et IDIV pour Integer MULtiplication
et DIVision (X et / des nombres entiers) mais au fait il sagit de
Multiplication et Division des nombres signes.
DIVISION SIGNEE NUM. (> ou <) DENOM. (> ou <) QUOTIENT RESTE
Mot/Octet AL = Octet CBW Reg. ou mem. DXAX (mme remarque que prcdemment)
DoubleMot/Mot
Djamal Rebane 72
Title exemple pour trouver la moyenne dun ensemble de nombres
PILE segment stack
dw 100 dup (?)
PILE ends
DATA segment
SIGN_DAT DB +13,-10,+19,+14,-18,-9,+12,-9,+16
MOYENNE DW ?
RESTE DW ?
DATA ends
CODE segment
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS,AX
MAIN:
MOV CX,9 ; Charger le compteur
XOR BX,BX ; Mettre a 0 le registre BX, utilis comme accumulateur
MOV SI,OFFSET SIGN_DAT ; SI SIGN_DAT
ARRIERE: MOV AL,[SI] ; Un octet de donne AL
CBW ; Extension du signe AX
ADD BX,AX ; BX+AXBX
INC SI ; SI+1 SI
LOOP ARRIERE ; Boucler tant que CX > 0
MOV AL,9 ; Le nombre totales des tempratures AL
CBW ; Extension du signe AX
MOV CX,AX ; Sauvegarder le DENOMINATEUR dans CX
MOV AX,BX ; LA somme des tempratures AX
Djamal Rebane 73
Expression arithmtique
X = (A*2 + B*C)/(D-3)
.......
Data segment
X dw ?
A dw ?
B dw ?
C dw ?
D dw ?
Data ends
Arithmetique proc near
MOV AX, 2 ;tablir la constante
IMUL A ;DX:AX = A*2
MOV BX,DX ;
MOV CX,AX ;BX:AX = A *2
MOV AX,B
IMUL C ;DX:AX = B*C
ADD AX,CX ;AX = AX + CX ! faites attention, il peut y avoir une retenue ici
ADC DX,BX ;DX:AX = A*2+B*C + la retenue sil y a lieu avec ADC
MOV CX, D
SUB CX,3 ; cx = D -3
IDIV CX ; AX =(A*2 + B*C)/(D-3)
MOV X,AX ; X = ax (A*2 +B*C)/(D-3) stocker le rsultat
RET
Arithmetique endp ; fin de la procedure
............
Djamal Rebane 74
Conversion dune chaine de caractres en
une valeur dcimale
Toute information introduite via le clavier est
considre comme une chane de
caractres. Ainsi, si on introduit le nombre
827, il sera considr par lassembleur
comme la chane de caractres 827.
Pour avoir sa valeur numrique, il y a lieu
de la convertir suivant lalgorithme suivant:
Djamal Rebane 75
Algorithme de conversion
nbre = nombre de caractre lus
Nombre = 0
Repeter
chiffre = caractre lu
nombre = nombre *10+chiffre
nbre = nbre -1
Si nbre > 0 aller repeter
Djamal Rebane 76
Exemple
827
nombre = 0
Chiffre = 8
nombre = nombre * 10 +chiffre =0*10+8 = 8
Chiffre = 2
nombre = nombre * 10 + 2 = 8*10 + 2 = 82
Chiffre = 7
Nombre = nombre * 10 + 7 = 82*10+7 = 827
Djamal Rebane 77
En assembleur, on aura quelque chose comme ci-dessous
TITLE caracteresversnombre
SPILE SEGMENT STACK
DW 100 DUP(?)
SPILE ENDS
SDATA SEGMENT
chaine db 255 dup('$')
SDATA ENDS
SCODE SEGMENT
ASSUME CS:SCODE,DS:SDATA
DEBUT:
mov AX,sdata
mov DS,AX
mov DX,offset chaine
mov AH,0ah
int 21h
mov SI,1
mov AX,0
xor CX,CX
mov CL,chaine[si]
inc SI
repeter:
mov DX,10
mul DX
mov DL,chaine[si]
sub DL,48; ou bien 30h, cest pareil. Cest pour rendre le caractre lu comme une valeur numrique
mov DH,0
add AX,DX
inc SI
loop repeter
MOV AX,4C00H
INT 21H
SCODE ENDS
END DEBUT
Djamal Rebane 78
Pour lire une chaine de caractres, appeler 21h fonction 0Ah qui installe les
caractres taps dans une zone repre par DS:DX (buffer dclare dans le
segment de donnes). La fonction se termine quand un return (touche
entre) est dtect. Le buffer contient alors les informations suivantes:
byte contenu
0 nombre maximum de caractres lire
Djamal Rebane 79
Conversion dune valeur dcimale en une
chane de caractres
Djamal Rebane 80
Algorithme
k=0
do
quotient = nombre / 10;
reste = nombre % 10;
tab[k] = reste;
nombre = quotient;
k++
while (quotient != 0)
Djamal Rebane 81
Dans ce programme, les chiffres composant le nombre contenu dans AX
est affich dans le bon ordre
Djamal Rebane 82
fin_div:
add AH,48
mov byte ptr[si],AH
;tabconv contient le nombre converti lenvers
xor BX,BX
mov BX, offset tabsortie ; declarer dans le
segment de donnes
xor AX,AX
st_bcl:
cmp SI,start
jb fin_bcl
mov AH , byte ptr[si]
mov byte ptr[bx] , AH
dec si
inc bx
jmp st_bcl
Djamal Rebane 83
fin_bcl:
mov byte ptr[bx],10
inc BX
mov byte ptr[bx],13
inc BX
mov byte ptr[bx],'$'
mov dx,offset tabsortie
mov ah,09h
int 21h
MOV AX,4C00H
INT 21H
SCODE ENDS
END DEBUT
Djamal Rebane 84
La directive EQU
La directive EQU a un rle voisin de
celui des macros. Elle permet de
remplacer un simple mot par dautres
plus complexes. Son intrt est
quelle peut tre invoque en plein
milieu dune ligne.
Djamal Rebane 85
Quelques exemples
Djamal Rebane 86
Les piles
Djamal Rebane 87
Utilit d'une pile
Une pile est une zone de mmoire dans laquelle on peut stocker
temporairement des registres. Il s'agit d'un moyen d'accder des donnes
en les empilant, telle une pile de livre, puis en les dpilant pour les utiliser.
Ainsi il est ncessaire de dpiler les valeurs stocker au sommet (les
dernires avoir t stockes) pour pouvoir accder aux valeurs situes
la base de la pile.
En ralit il s'agit d'une zone de mmoire et d'un pointeur qui permet de reprer
le sommet de la pile.
La pile est de type LIFO (Last In First Out), c'est--dire que la premire
valeur empile sera la dernire sortie (Si vous empilez des livres, il vous
faudra les dpiler en commenant par enlever les livres du dessus. Le
premier livre empil sera donc le dernier sorti!).
Djamal Rebane 88
Ainsi, l'instruction
PUSH BX
empile le contenu du registre BX,
et l'instruction
POP AX
Djamal Rebane 89
Utilisation de la pile sur un exemple
Dans l'exemple suivant, que l'on
imaginera au milieu d'un programme, on
stocke les valeurs contenues dans AX et
BX pour pouvoir utiliser ces deux
registres, puis une fois l'opration
accomplie on remet les valeurs qu'ils
contenaient prcdemment...
Djamal Rebane 90
PUSH AX
PUSH BX
MOV AX, [0140]
ADD BX, AX
MOV [0140], BX
POP BX
POP AX
Djamal Rebane 91
Les registres SS et SP Les registres SS et SP
sont deux registres servant grer la pile:
Djamal Rebane 92
SP pointe vers le sommet, c'est--dire sur le
dernier bloc occup de la pile. Lorsque l'on
ajoute un lment la pile, l'adresse contenue
dans SP est dcrmente de 2 octets (car un
emplacement de la pile fait 16 bits de longueur).
En effet, lorsque l'on parcourt la pile de la base
vers le sommet, les adresse dcroissent.
Par contre l'instruction POP incrmente de 2
octets (16 bits) la valeur de SP.
Djamal Rebane 93
PUSH: SP <- SP - 2
POP: SP <- SP + 2
Djamal Rebane 94
Dclarer une pile
Pour pouvoir utiliser une pile, il faut la dclarer,
c'est--dire rserver un espace mmoire pour
son utilisation, puis initialiser les registres avec
les valeurs correspondant la base de la pile,
ainsi que son sommet (rappel: situ sous la pile
lorsque celle-ci est vide).
Ainsi pour dfinir une pile, il s'agit tout d'abord
de la dclarer grce la directive SEGMENT
stack.
Djamal Rebane 95
Dclaration d'une pile
Pour utiliser une pile en assembleur, il faut dclarer un segment de pile, et y
rserver un espace suffisant. Ensuite, il est ncessaire d'initialiser les
registres SS et SP pour pointer sous le sommet de la pile. Voici la
dclaration d'une pile de 200 octets :
Noter le mot clef ``stack '' aprs la directive SEGMENT, qui indique
l'assembleur qu'il s'agit d'un segment de pile.
Afin d'initialiser SP, il faut reprer l'adresse du bas de la pile; c'est le rle de la
ligne base_pile EQU this word (voir figure suivante).
Djamal Rebane 96
Djamal Rebane 97
Suite aux dclarations, il faut crire une
squence d'initialisations:
Djamal Rebane 98
Les procdures-fonctions
La notion de procdure - fonctions
En langage assembleur, on appelle procdure un sous-
programme qui permet d'effectuer un ensemble
d'instructions par simple appel de la procdure. Cette
notion de sous-programme est gnralement appele
fonction dans d'autres langages. Les fonctions et les
procdure permettent d'excuter dans plusieurs parties
du programme une srie d'instruction, cela permet une
simplicit du code et donc une taille de programme
minimale. D'autre part, une procdure peut faire appel
elle-mme, on parle alors de procdure rcursive (il ne
faut pas oublier de mettre une condition de sortie au
risque sinon de ne pas pouvoir arrter le programme...).
Djamal Rebane 99
Djamal Rebane 100
La dclaration d'une procdure
Etant donne qu'une procdure est une suite d'instructions, il s'agit de
regrouper les instructions composant la procdure entre des mots
cls. L'ensemble de cette manipulation est appele dclaration de
procdure.
Etiquette ENDP
Cela parat simple mais le problme provient du fait que les procdures
peuvent tre imbriqus, c'est--dire que de saut en saut, le
processeur doit tre capable de revenir successivement aux
adresses de retour. En fait, chaque appel de fonction via
l'instruction CALL, le processeur empile l'adresse contenue dans le
registre IP (il pointe alors sur l'instruction suivant l'instruction CALL)
avant de la modifier, l'appel de l'instruction RET (qui ne prend pas
d'arguments) le contenu de la pile est dpil puis stock dans le
registre IP.
code segment
assume cs:code, ds:code, ss:pile
debut:
MOV AX, data
MOV DS, AX
MOV AX, Pile
MOV SS, AX ; initialise le segment de pile
MOV SP, basedepile
MOV CX,12
boucle: call ecritmessage ; appel de procdure
LOOP boucle ; dcrementer CX de une unit et aller
; boucle si CX est diffrent de 0
MOV AX, 6
MOV BX, Truc
CALL SOMME
MOV Truc, AX
Cette technique met en oeuvre un nouveau registre, BP (Base Pointer), qui permet de lire
des valeurs sur la pile sans les dpiler ni modifier SP.
MOV AX, [BP+6]; cette instruction charge le contenu du mot mmoire d'adresse BP+6
dans AX.
PUSH 6
PUSH Truc
CALL SOMME2
push AX
push BX
push CX
push DX
call soubroutine ; branchement vers la procdure
; ......... Contineur traitement
La syntaxe suivante :
affiche Coucou ! Ceci est un essai !, 10, 13, $
Exemple:
mesg DB bonjour$
Message DB 'Bonjour$' est la mme chose que
Message DB 'B', 'o', 'n', 'j', 'o', 'u', 'r', '$' ou que
Message DB 66, 111, 110, 106, 111, 119, 114, 36
La seule obligation est le caractre '$' qui indique la fin de la chane (sinon
les octets situs la suite du message en mmoire sont aussi affichs
comme caractres).
Remarque: Les registres SI, DI, BX peuvent tre utiliss indiffrement pour
accder aux lments dune chane.
Vecteur dentiers
Le principe est le mme pour un vecteur dentiers o chaque lment
est stock sur un entier. Pour un vecteur dentiers stocks sur deux
octets nous devons tenir compte de la longueur dun lment du
vecteur.
Exemple:
Indice 1 2 3 4
Dplacement 0 1 2 3 4 5 67
|--------------------------------------------|
t |x x | x x | x x | xx |
---------------------------------------------
; AX t[i]
mov SI,i
ADD SI,SI; SI = SI * 2 (longeur dun lment)
MOV AX, t[SI]
; t[i] AX
MOV SI, i
ADD SI, SI
MOV t[SI], AX
Exemple:
Ligne 1 x x x x x x x x
Ligne 2 x x x x x x x x
Ligne 3 x x x x x x x x
Implmentation em mmoire
Ligne 1 ligne 2 ligne 3
xx xx xx xx xx xx xx xx xx xx xx xx
0 1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19 20 21 22 23 24
Title parcours
pile segment stack
100 dup (?)
pile ends
data SEGMENT
tab DB 'Un boeuf Bourguignon', '$'
data ENDS
code SEGMENT
ASSUME DS:data, CS:code
debut: MOV AX, data
MOV DS, AX
MOV BX, offset tab ; adresse debut tableau
repet: MOV AL, [BX] ; lit 1 caractre
AND AL, 11011111b ; force bit 5 zero
MOV [BX], AL ; range le caractre
INC BX ; passe au suivant
CMP AL, '$' ; arrive au $ final ?
JNE repet ; sinon recommencer
MOV AH, 4CH
INT 21H ; Retour au DOS
code ENDS
END debut
DF(registreflag)Incrmentation(DF=0)Dcrmentation(DF=1)dupointeurutilispourlesoprations
CLD DF=0 STD DF=1
CODE ENDS
END MAIN
TITLE PROG12.asm ; Balayer une chane de caractre et Remplacer une lettre particulire par une autre
Pile segment stack
dw 100 dup(?)
Pile ends
Data segment
CHAINE DB Mr. Gones , $
Data ends
Code segment
MAIN: assume CS:code, DS:Data, ES:Data
MOV AX,DATA
MOV DS,AX ; Initialiser le segment de donnes
;MOV ES,AX ; Initialiser le segment Extra
CLD ; DF=0 Auto-incrmentation des pointeurs SI et DI
MOV DI, OFFSET CHAINE ; Charger le pointeur destination ES:DI
MOV CX, 9 ; Charger le compteur avec 9 (la taille de la chane de caractres)
MOV AL, G ; le caractre a scanner (balayer)
REPNE SCASB ; Rpter le balayage tant que les deux lettres ne sont pas gales ou jusqua C= 0.
JNE PASSE ; Saut si ZF=0 afficher le message 1 (galit)
DEC DI ; Dcrmenter DI (a la lettre G) car entre autre DI sest automatiquement incrment
MOV BYTE PTR[DI], J ; Remplacer G par J
PASSE: MOV DX, OFFSET CHAINE
AFFICHAGE: MOV AH,09H ; le message correcte est affiche: Mr. Jones
INT 21H ; DOS
Code ENDS
END MAIN
entier factoriel(entier)
int factoriel(entier n)
{
si (n < 1) retourner 1
retourner n * factoriel(n-1)
}
Fin: pop AX; le rsultat calcul par la fonction factoriel est dans AX
mov fact, AX
mov AX,4c00h
int 21h
Depiler:
POP AX
POP CX
mul CX
Push AX
CMP BX,CX
Ja depiler
ret
factoriel endp ; fin de la procdure
code ends
end debut ; fin du programme code