Sunteți pe pagina 1din 6

Les instructions de boucles

Excuter une boucle consiste rpter une srie dinstructions. Le nombre de rptitions pourra tre fix ou dpendre dune condition. Il sagit donc dune extension des instructions conditionnelles. Les formes disponibles sont les suivantes : LOOP id LOOPNE id LOOPE id O id reprsente un label.

Linstruction LOOP
Cette instruction dcrmente le registre CX et effectue un branchement au label spcifi condition de CX soit non nul. Exemple : Calcul de la somme des nombres de 1 100 : MOV AX, 0 MOV BX, 0 Repeter : INC BX ADD AX, BX LOOP Repeter

Linstruction LOOPE
Cette instruction dcrmente le registre CX et effectue un branchement au label spcifi dans un des cas suivants: Si CX est non nul ; Si lindicateur ZF = 1 Exemple : On compare deux chanes jusqu trouver un caractre diffrent : Ch1 Ch2 Lg db ceci est la premiere db ceci est la seconde EQU $-ch1 ; longueur de ch1 = nombre MAX ;de caractres a compare SI, offset DI, offset DS ES ch1 ch2 ; ES DS

MOV MOV PUSH POP Look : CMPSB

; Compare DS :[SI] et ES :[DI]

LOOPE Look ; continue tant que les caractres ; sont gaux, sarrte aussi si le nombre MAX de caractres est atteint. 1

Les procdures (sous-programme)


Les sous-programmes sont constitus dune suite dinstructions comme nimporte quel programme. Ils sont en gnral prvus pour excuter un traitement particulier comme : Afficher un message ; Lire un caractre au clavier Imprimer un texte Initialiser des variables

Un programme sera souvent constitu de plusieurs sous-programmes.

Les instructions PROC et ENDP


Linstruction PROC signale lassembleur le dbut dun sous-programme et ENDP signale la fin des instructions du sous-programme. Les formes disponibles de ces instructions sont : Nomdeproc PROC NEAR Nomdeproc PROC FAR Nomdeproc ENDP O Nomdeproc est un identificateur reprsentant le nom que le programmeur donne au sous-programme. N.B : Nomdeproc doit tre identique dans les instructions PROC et ENDP dun mme sous-programme ! Exemple : Ce sous-programme lit un caractre au clavier et lenvoie au programme appelant par lintermdiaire du registre AL : lireCar PROC MOV AH, 0 INT 16H ENDP NEAR

lireCar

Linstruction CALL
Cette instruction force le microprocesseur excuter les instructions du sous-programme spcifi avant de continuer. Ds que le sous-programme est termin, lexcution reprendra son cours linstruction qui suit le CALL. Les deux formes disponibles sont : CALL Nomdeproc CALL mem Ou Nomdeproc est un identificateur reprsentant un sous-programme dfini avec linstruction PROC cite prcdemment ; mem est une adresse. Exemples : 2

lireCar lireCar impCar . impCar

PROC ENDP PROC ENDP CALL CALL

NEAR

NEAR

lireCar impCar

Linstruction RET
Cette instruction doit faire partie des instructions dun sous-programme, elle permet de rendre le contrle linstruction qui suit celle qui a provoqu lexcution du sous-programme. Attention, si on omet linstruction RET ou si le sous-programme se termine sans lavoir excuter, il ny aura pas de RETOUR au programme appelant. Lexcution conduira alors linstruction qui suit le ENDP et les rsultats sont bien entendu imprvisibles !!! Exemples : lireCar PROC MOV AH, 0 INT 16H RET ENDP

lireCar

Les paramtres et les sous-programmes Un sous-programme pouvant tre appel de diffrents endroits dun programme, il sera parfois ncessaire de lui transmettre des paramtres. Par exemple, un sous-programme qui affiche un message lcran aura deux paramtres : le segment et loffset du message. Il y a en fait trois possibilits de transmission de paramtres : Par les registres, cest trs limit si on a besoin de beaucoup de paramtres ; Par le pile, cest la mthode qui prsente le moins de limitations ; Par des variables, cest une trs bonne mthode mais elle ncessite beaucoup de variables. Nous avons vu quaprs avoir excut les instructions dun sous programme, la prochaine instruction qui sera excute est celle qui est juste aprs lappel au sous-programme. Il est donc ncessaire de sauver ladresse de cette instruction : si le sous-programme est dans le mme segment, on ne devra sauver que IP et sil est dans un autre segment, on devra sauver CS et IP. Ces registres seront sauvs sur la pile. Pour bien comprendre le fonctionnement de la pile et des sous-programmes, nous allons illustrer la seconde mthode de transmission de paramtres.

La marche suivre avant dappeler le sous-programme consiste doc empiler les paramtres et cest le 8088 qui empilera automatiquement IP (et CS si ncessaire). Par exemple, si la procdure qui affiche un message sappelle affiche , on aura : PUSH PUSH CALL DS DX affiche ;(si DS = segment du message afficher). ;( si DX = offset du message afficher). ; on appelle le sous-programme affiche

Au moment o affiche reoit le contrle, le stack aura lallure suivante :


100 98 96 94 92 SP

Valeur de DS Valeur de DX Valeur de CS Valeur de IP

Sommet de la pile

Un sous-programme ne pourra lire les paramtres qui lui sont destins quau moyen du registre BP. La premire opration dont il devra soccuper consiste donc assurer ce quon nomme ladressabilit du stack : Il devra sauvegarder la valeur actuelle de BP (PUSH BP) ; Il devra initialiser BP la mme valeur que SP (MOV BP, SP) ;
100 98 96 94 92 90 SP

Valeur de DS Valeur de DX Valeur de CS Valeur de IP Valeur de BP

BP+8 BP+6 BP+4 BP+2 BP

Les paramtres pourront ainsi tre lus avec des instructions du type : MOV AX, [BP+6] MOV BX, [BP+8] Lorsquun sous-programme se termine, il devra dabord rcuprer la valeur originale de BP, il excutera ensuite une instruction jai fini qui invitera le microprocesseur lire ladresse du programme appelant (qui se trouve au sommet de la pile) et les valeurs de CS et IP seront rinitialises ; ce qui rendra le contrle au programme appelant. Voyons cela par un exemple, voici ltat dune pile de 50 lments au dmarrage dun programme (les chiffres sur la gauche sont des offsets lintrieur du Stack Segment SS) :
100 SP 98 BP 96 94 92 Sommet de la pile ... .

Le programme X a besoin du registre CX pour quelque chose, mais CX contient une valeur que le programme veut conserver, il utilise la pile pour sauvegarder temporairement CX : PUSH CX ;(empile CX) 4

La pile aura alors lallure suivante :


98 BP, SP 96 94 92 Valeur de CX . Sommet de la pile

PUSH DS donnera :
98 96 94 92 BP SP Valeur de CX Valeur de DS .

Sommet de la pile

Le programme (X) va maintenant appeler le sous-programme X+1, il lui transmet deux paramtres contenus dans BX et DX : PUSH PUSH CALL BX DX Xplus1

; (appel X+1)

Au moment o X+1 reoit le contrle, la pile a lallure suivante :


98 BP 96 94 92 90 88 SP Valeur de CX Valeur de DS Valeur de BX Valeur de DX CS de X IP de X (Valeur du registre CS au moment de lappel) (Valeur du registre IP au moment de lappel)

Maintenant X+1 a le contrle, pour pouvoir lire les donnes sur la pile, il aura besoin de BP (cest la rgle) mais il doit sauver la valeur de BP au cas ou le programme prcdent lutilise car un sous-programme doit toujours sauver les registres quil utilise et les rtablir leur valeur original juste avant de se terminer : PUSH MOV Ce qui donne :
98 96 94 92 90 88 86 BP, SP Valeur de CX Valeur de DS Valeur de BX Valeur de DX CS de X IP de X BP de X

BP BP, SP

; (sauve BP sur la pile) ;(BP reoit la valeur de SP)

(Paramtre 1) (Paramtre 2) (Valeur du registre CS au moment de lappel) (Valeur du registre IP au moment de lappel)

Les paramtres pourront maintenant tre consults. (BP+8 = paramtre 1, BP+6 = paramtre 2, les lments de la pile ont toujours 2 octets). Enfin X+1 doit rtablir la valeur de BP : 5

POP BP ;(prend la dernire valeur de la pile et la met dans le registre BP) Aprs un RET, le microprocesseur prendra alors les deux valeurs en haut du stack (en SP et SP+2) et rinitialisera CS et IP. Ce qui redonne le contrle X.

S-ar putea să vă placă și