Escolar Documentos
Profissional Documentos
Cultura Documentos
Niveaux de programmation
Niveaux de programmation
circuit logiques
0/1
--------------------------------------------------------------------------------unit de traitement
micro-instructions
(UAL, chemins de donnes)
(Unit de commande)
= suite de 0/1
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
Exemple
TITLE prog2.asm: Exemple sur ROL,
Pile segment stack ;
dw 100 dup(?)
Pile ends
DATA segment
DATA1DW
COMPTE
DATA ends
5F97H
DB
CODE segment
MAIN:
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS, AX
XOR
MOV
MOV
ENCORE: ROL
JNC
INC
PROCHAIN: DEC
JNZ
MOV
MAIN
BL, BL
DL, 16
AX, DATA1
AX, 1
PROCHAIN
BL
DL
ENCORE
COMPTE, BL
Djamal Rebane
Djamal Rebane
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
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
Djamal Rebane
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
Djamal Rebane
10
Arrt de programme:
Djamal Rebane
11
if then else
Assembleur
If ax =1
bx = 10;
else {
bx = 0;
cx = 10;
}
if:
CMP AX, 1
JNZ Else
Djamal Rebane
12
Instruction i
Instruction i
Si condition alors
Instructions j
Sinon
Instruction m
Fin si
Instructions k
VRAI
FAUX
Condition ?
Instructions m
Instructions j
Instructions k
Djamal Rebane
13
La boucle FOR
Assembleur
MOV BX,0
MOV CX,0
CMP CX,10
JA Endfor
ADD BX,CX
INC CX
JMP For
Endfor:
Djamal Rebane
14
WHILE
bx = 5
while (bx >0)
bx = bx -1;
Assembleur
while:
MOV BX,5
CMP BX,0
JLE Endwhile
DEC BX
JMP while
Endwhile:
Djamal Rebane
15
SWITCH
switch (n) {
case 1: ....; break;
case 2: .....; break;
default: .....;
}
Assembleur
CMP n,1
JNE case2
............
JMP endswitch
case2: CMP n,2
JNE default
..........
JMP endswitch
default: ...........
endswitch: ...........
Djamal Rebane
16
En assembleur
if: cmp a, b
jng endif
................
}
cmp c, d
jnle endif
..............
endif:
}
Djamal Rebane
17
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.
C. Registre indicateur : utilis pour sauvegarder des tats particuliers
du microprocesseur en rfrence la dernire instruction excute.
Quelques bits seulement de ce registre ont une signification sont
nomms: CF (retenue), OF (dbordement), etc.
Djamal Rebane
19
Djamal Rebane
20
Djamal Rebane
21
22
23
24
; AH <- 5
; BH <- 9
; AH <- AH AND BH; AH vaut 0001b, soit 1
; AH <- 5
; BH <- 9
; AH <- AH OR BH; AH vaut 1101b, soit 13 (8+4+1)
; AH <- 5
; BH <- 9
; AH <- AH XOR BH; AH vaut 1100b, soit 12 (8+4)
; AH <- 5 Not AH ; AH <- NOT AH; AH vaut 1010b, soit 10
Djamal Rebane
25
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
Remarque: CMP est identique linstruction SUB, mais ne produit pas de
rsultat. Il positionne cependant les flags. Il permet de sauter un label qui
est une adresse de 16 bits. Les sauts un label sont toujours courts (
peu prs de 127octets). Il faut donc prendre garde que ce label puisse tre
atteint.
Djamal Rebane
27
Djamal Rebane
28
JZ
Saut si zro.
JE
Saut si gal.
JC
JNC
JB
Saut si infrieur.
JNB
JNAE
CF = 1
JAE
JS
SF = 1
JNS
JO
Saut si dbordement.
OF = 1
JNO
JPE
JP
Saut si parit.
PF = 1
JPO
JNZ
JNE
Saut si diffrent.
JNC
JC
JNB
JB
JAE
CF = 0
JNAE
JNS
SF = 0
JS
JNO
OF = 0
JO
JPO
JNP
Djamal Rebane
JNZ
ZF = 1
JNE
JZ
ZF = 0
JE
JPE
PF = 0
JP
29
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
Djamal Rebane
32
33
Djamal Rebane
34
Djamal Rebane
35
Applications de quelques
instructions sur des exemples
Djamal Rebane
36
PASSE:
TEMP
DW
235FH
MOV
MOV
CMP
JNC
ADD
ADD
BX, 7888H
CX, 9FFFH
BX, CX
PASSE
BX, 4000H
CX, DATA1
DB
MOV
CMP
JZ
INC
PROCHAIN: HLT
AL, TEMP
AL, 99
PROCHAIN
BX
; 7888Hh BX
Compar
e
Oprand
es
C
F
ZF
Dest. >
Src.
Dest. =
Src.
Dest. <
Src.
; TEMP AL
; TEMP = 99?. Avec (SUB AL, 99), la mme chose mais 0 AL
; Si ZF=1 (TEMP=99), Saute a PROCHAIN:
; Sinon incrmente BX
; Arrt du programme
Djamal Rebane
37
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
38
Djamal Rebane
39
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
40
41
Djamal Rebane
42
Buffer DB 8 DUP(0)
..
Boucle:
MOV AH,1 ;lecture
INT 21h
MOV [BX], AL; rangement de quon vient de lire
INC BX
CMP AL, 0Dh; a-t-on lu le retour chariot?
LOOPNE Boucle; sinon on continue jusqu CX = 0 ????
Djamal Rebane
43
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
44
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
2. Operateur PTR: Permet de passer outre la taille dclare au dpart pour un
oprande. Par exemple,
double dd 12345678h
Djamal Rebane
45
Djamal Rebane
46
Djamal Rebane
47
Djamal Rebane
48
49
50
Djamal Rebane
51
52
Djamal Rebane
53
54
Djamal Rebane
55
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
affiche recup_val1 ; permet dafficher le message contenu dans recup_val1
MOV val1,AL
MOV AH,1 ;faire une lecture au clavier dun caractre
INT 21h
affiche recup_val2 ; afficher un message
MOV AH,1 ; faire une lecture au clavier
int 21h
MOV val2,AL
CMP AL,val1
JG grand
Djamal Rebane
56
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
57
Djamal Rebane
58
59
60
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
61
Djamal Rebane
62
Djamal Rebane
63
Conversion Minuscule en
Majuscule
L
Hex
Binaire
Hex
Binaire
41
01000001
61
01100001
42
01000010
62
01100010
59
01011001
79
01111001
5A
01011010
7A
01111010
Djamal Rebane
64
Djamal Rebane
65
Djamal Rebane
66
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
67
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
68
;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
69
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
70
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
QUOTIENT
RESTE
Octet/Octet
AL = Octet CBW
Reg. ou mem.
AL
AH
Mot/Mot
AX = Mot CWD
Reg. ou mem.
AX
DX
AX = Mot
Reg. ou mem.
AL (Erreur si 128>AL>+127)
AH
DXAX = DoubleMot
Reg. ou mem.
AX (Erreur si 32768>AX>+32767)
DX
Mot/Octet
DoubleMot/Mot
MULTIPLICATION
SIGNEE
OPERANDE 1
(> ou <)
OPERANDE 2
(> ou <)
RESULTAT
Octet/Octet
AL
Reg. ou mem.
Mot/Mot
AX
Reg. ou mem.
AL = Octet CBW
Reg. ou mem.
Mot/Octet
DoubleMot/Mot
Djamal Rebane
71
ARRIERE:
MAIN
MOV
XOR
MOV
MOV
CBW
ADD
INC
LOOP
MOV
CBW
MOV
MOV
CX,9
BX,BX
SI,OFFSET SIGN_DAT
AL,[SI]
BX,AX
SI
ARRIERE
AL,9
CX,AX
AX,BX
; Charger le compteur
; Mettre a 0 le registre BX, utilis comme accumulateur
; SI SIGN_DAT
; Un octet de donne AL
; Extension du signe AX
; BX+AXBX
; SI+1 SI
; Boucler tant que CX > 0
; Le nombre totales des tempratures AL
; Extension du signe AX
; Sauvegarder le DENOMINATEUR dans CX
; LA somme des tempratures AX
Djamal Rebane
72
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
IMUL A
MOV BX,DX
MOV CX,AX
MOV AX,B
IMUL C
ADD AX,CX
ADC DX,BX
MOV CX, D
SUB CX,3
IDIV CX
MOV X,AX
RET
Arithmetique endp
............
;tablir la constante
;DX:AX = A*2
;
;BX:AX = A *2
;DX:AX = B*C
;AX = AX + CX ! faites attention, il peut y avoir une retenue ici
;DX:AX = A*2+B*C + la retenue sil y a lieu avec ADC
; cx = D -3
; AX =(A*2 + B*C)/(D-3)
; X = ax (A*2 +B*C)/(D-3) stocker le rsultat
; fin de la procedure
Djamal Rebane
73
Djamal Rebane
74
Algorithme de conversion
75
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
76
Djamal Rebane
77
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
0
contenu
nombre maximum de caractres lire
Djamal Rebane
78
Djamal Rebane
79
Algorithme
k=0
do
quotient = nombre / 10;
reste = nombre % 10;
tab[k] = reste;
nombre = quotient;
k++
while (quotient != 0)
Djamal Rebane
80
Djamal Rebane
81
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
82
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
83
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
84
Quelques exemples
Longueur EQU (fin debut)
Message EQU Bonjour messieurs ! Comment
allez-vous ?, $
Version EQU 2
Quitter EQU ret
Quitter2 EQU int 20h
Mettre_dans_AH EQU mov ah,
Interruption_21h EQU int 21h
Djamal Rebane
85
Les piles
Djamal Rebane
86
Djamal Rebane
87
Ainsi, l'instruction
PUSH BX
empile le contenu du registre BX,
et l'instruction
POP AX
rcupre le contenu du sommet de la pile et le
transfre dans AX.
Djamal Rebane
88
Djamal Rebane
89
PUSH AX
PUSH BX
MOV AX, [0140]
ADD BX, AX
MOV [0140], BX
POP BX
POP AX
Djamal Rebane
90
Djamal Rebane
91
Djamal Rebane
92
PUSH: SP <- SP - 2
POP: SP <- SP + 2
Ainsi, lorsque la pile est vide SP pointe
sous la pile (la case mmoire en-dessous
de la base de la pile) car il n'y a pas de
case occupe. Un POP provoquera alors
une erreur...
Djamal Rebane
93
94
Djamal Rebane
95
Djamal Rebane
96
Djamal Rebane
97
Les procdures-fonctions
La notion de procdure - fonctions
En langage assembleur, on appelle procdure un sousprogramme 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
98
Djamal Rebane
99
Djamal Rebane
100
Djamal Rebane
101
Djamal Rebane
102
103
Djamal Rebane
104
Djamal Rebane
105
; appel de procdure
; dcrementer CX de une unit et aller
; boucle si CX est diffrent de 0
Djamal Rebane
106
Djamal Rebane
107
Le passage de paramtres
Une procdure effectue gnralement des actions sur des donnes
qu'on lui fournit, toutefois dans la dclaration de la procdure il n'y a
pas de paramtres (dans des langages volus on place
gnralement les noms des variables comme paramtres entre des
parenthses, spars par des virgules). Il existe toutefois deux
faons de passer des paramtres une procdure:
Le passage des paramtres par registre: on stocke les valeurs dans
les registres utiliss dans la procdure
Le passage des paramtres par pile: on stocke les valeurs dans la
pile avant d'appeler la procdure, puis on lit le contenu de la pile
dans la procdure.
Le passage de paramtres par registres C'est une mthode simple
pour passer des paramtres: Elle consiste crire une procdure en
faisant rfrence des registres dans les instructions, et de mettre
les valeurs que l'on dsire dans les registres juste avant lappel de la
fonction...
Djamal Rebane
108
Djamal Rebane
109
Djamal Rebane
110
111
Djamal Rebane
112
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.
Le registre BP permet un mode d'adressage indirect spcial, de la forme :
MOV AX, [BP+6]; cette instruction charge le contenu du mot mmoire d'adresse BP+6
dans AX.
Ainsi, on lira le sommet de la pile avec :
MOV BP, SP
;BP pointe sur le sommet
MOV AX, [BP]
;lit sans dpiler et le mot suivant avec :
MOV AX, [BP+2]
;2 car 2 octets par mot de pile.
113
passage de paramtres
push AX
push BX
push CX
push DX
call soubroutine
; .........
Djamal Rebane
114
Emplacement de sous-programmes
En gnral, les sous-programmes sont mis la fin
du programme principal. Mais, on peut aussi les
mettre dans la partie du segment de code.
Seulement,il faudra sassurer que la premire
instruction de code excute soit celle du
programme principal. Pour cela, il suffit juste de
mettre un JMP juste avant la dclaration du
sous-programme.
Djamal Rebane
115
Djamal Rebane
116
DEBUT:
mov ax,sdata
mov ds,ax
mov SI,0; sert dindice tableau
MOV BX, 5; compteur de nombre manipuler
mov CH, valeurs[SI]
INC SI
repeter:
CMP BX,0
JE fin
mov CL, valeurs[SI]
Call PGCD
INC SI
DEC BX
JMP repeter
Fin: ; le PGCD de tous les nombres est dans CH
Djamal Rebane
117
xor ax,ax
; tout ce qui suit sert afficher les chiffres contenus dans le PGCD qui est dans CH
mov al,ch
mov si, offset tab_conv
mov start, offset tab_conv ;start sert garder le dbut du tableau
mov bx,0
mov bl,10
division:
; on suppose que la division se fait sur des nombre de 16 bits
div bl
cmp al,0
je fin_div
add ah,48
mov byte ptr[si],ah
mov ah,0
inc si
jmp division
fin_div:
add ah,48
mov byte ptr[si],ah
; tab_conv contient le nombre converti lenvers
xor bx,bx
mov bx, offset tab_sortie
xor ax,ax
Djamal Rebane
118
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
fin_bcl:
mov byte ptr[bx],10
inc bx
mov byte ptr[bx],13
inc bx
mov byte ptr[bx],'$'
mov dx,offset tab_sortie
mov ah,09h
int 21h
Sortie: MOV AX, 4c00h;
Int 21h
SCODE ENDS
END DEBUT
Djamal Rebane
119
Djamal Rebane
120
121
Remarque: Les registres SI, DI, BX peuvent tre utiliss indiffrement pour
accder aux lments dune chane.
Djamal Rebane
122
123
Djamal Rebane
124
Les vecteurs
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:
T
T1
Djamal Rebane
125
1
2
3
4
0 1
2 3
4 5
67
|--------------------------------------------|
|x x | x x | x x |
xx |
---------------------------------------------
126
Exemple:
; 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
Djamal Rebane
127
4 5
6 7
8 9
10 11 12 13 15 16 17 18 19 20 21 22 23 24
Djamal Rebane
128
Djamal Rebane
129
130
131
1.
2.
3.
4.
Djamal Rebane
132
Djamal Rebane
133
Rsum des instructions sur des chanes de caractres pour effectuer des oprations avec des
oprandes se trouvant dans des locations mmoire.
Instruction
Mnmonique
Destination
Source
Prfixe
MOVSB
ES:DI
DS:SI
REP
MOVSW
ES:DI
DS:SI
REP
STOSB
ES:SI
AL
REP
STOSW
ES:SI
AX
REP
LODSB
AL
DS:SI
LODSW
AX
DS:SI
CMPSB
ES:DI
DS:SI
REPE/REPNE
CMPSW
ES:DI
DS:SI
REPE/REPNE
SCASB
ES:DI
AL
REPE/REPNE
SCASW
ES:DI
AX
REPE/REPNE
DF(registreflag)Incrmentation(DF=0)Dcrmentation(DF=1)dupointeurutilispourlesoprations
CLD
DF=0
STD
DF=1
Djamal Rebane
134
Djamal Rebane
135
Djamal Rebane
136
137
Djamal Rebane
138
Djamal Rebane
139
Exemple: REP
MOVSB et CLD
TITLE
PROG3_12.asm
;Transfert un bloc de 20 octets dans la mmoire
pile segment stack
dw 100 dup (?)
pile ends
data segment
DATA_S
DB
AQWERTTYUIOPLJKHGFDS
DATA_D
DB
20 DUP(?)
data ends
Code segment
assume CS:Code, ES:data, DS:data
MAIN
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 SI,OFFSET DATA_S
; Charger le pointeur source
MOV DI,OFFSET DATA_D
; Charger le pointeur destination
MOV CX, 20
; Charger le compteur
REP
MOVSB; Dplacer les octets points par SI vers des locations points par DI
; et rpte jusqu CX 0, sachant qua chaque itration SI et DI sont
; automatiquement incrments
MOV AH,4CH
INT
21H
; DOS
Code ENDS
END MAIN
Djamal Rebane
140
Djamal Rebane
141
Exemple:
REPE CMPSB et CLD
TITLE
PROG11.asm; Vrifier lorthographe dun mot et afficher un message
PILE SEGMENT stack
DW 100 DUP (?)
PILE ENDS
Data SEGMENT
MOT_EXACT DB CHICOUTIMI
MOT_TAPEE DB
CIHCOUTIMI
MESSAGE1
DB
Lorthographe est juste , $
MESSAGE2
DB
Lorthographe est fausse , $
DATA ENDS
CODE SEGMENT
ASSUME CS:code, DS:data, ES: data
MAIN:
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 SI,OFFSET MOT_EXACT
; Charger le pointeur source
MOV DI,OFFSET MOT_TAPEE
; Charger le pointeur destination
MOV CX, 10
; Charger le compteur avec 10 (10 lettres ou octets)
REPE CMPSB
; Rpter tant que les deux lettres soient gales ou C= 0.
;Si cest diffrent le programme sort de cette instruction. A noter
;qu chaque itration SI et DI sont automatiquement incrments.
JE
PASSE
; Si ZF=1 afficher le message 1 (galit)
MOV DX,OFFSET MESSAGE2
; Si ZF=0 afficher le message 2 (diffrence)
JMP AFFICHAGE
PASSE: MOV DX, OFFSET MESSAGE1
AFFICHAGE: MOV AH,09H ; le message est Mmoire dfectueuse
INT
21H
; DOS
CODE ENDS
END MAIN
Djamal Rebane
142
Exemple:
REPNE
SCASB et CLD
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
Djamal Rebane
143
Donnee SEGMENT
chaine1 db 2000 dup(?)
chaine2 db 100 dup(?)
Donnee ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:Donnee, ES:Donnee
MOV AX, Donnee
MOV DS,AX
MOV ES,AX
ENTREE:
; initialiser sens de transfert
CLD
; adresse croissante
;initialiser chaine1 avec 200 caractres A
MOV AL, A
; caractres de remplissage
MOV CX,2000 ; longueur de la chane
LEA DI,chaine1 ; DI recoit ladresse de chaine1
REP STOSB
Djamal Rebane
144
; afficher chaine1
MOV CX,2000
LEA SI,chaine1
MOV AH,2 ;fonction DOS affichage dun caractre
Boucle: LODSB
MOV DL,AL
INT 21H
LOOP Boucle
; recopier dans chaine2 les 100 premiers caractres de chaine1
MOV CX,100
LEA SI,chaine1
LEA DI,chaine2
REP MOVSB
Djamal Rebane
145
Djamal Rebane
146
Djamal Rebane
147
La rcursivit
Dfinition:
Une procdure est dite rcursive si, et
seulement si, elle fait appel elle-mme,
soit directement soit indirectement
Djamal Rebane
148
Djamal Rebane
149
Djamal Rebane
150
Fonction principale
entier n nfact
lire n
si (n < 0) alors crire entre ngative: n
sinon
nfact
factoriel(n)
crire la factorielle de n est nfact
entier factoriel(entier)
Djamal Rebane
151
Fonction factoriel
int factoriel(entier n)
{
si (n < 1) retourner 1
retourner n * factoriel(n-1)
}
Djamal Rebane
152
Djamal Rebane
153
Djamal Rebane
154
Djamal Rebane
155