GIF-1001
Cours 9, p.1
Etienne Tremblay
Ordinateurs, Structure
et Applications
GIF-1001
Université Laval, Hiver 2012
Cours 9, Branchements et Pile
GIF-1001
Cours 9, p.2
Énoncés conditionnels et sauts, principe
L’instruction JMP Address permet de mettre IP à la valeur désignée par
Address. JMP permet un saut à l’intérieur du code segment.
Comme les adresses des instructions sont difficiles à retenir et qu’elles
peuvent changer lorsque le programme change, des labels ont été inventés.
Un label est une étiquette remplaçant l’adresse d’une instruction.
L’instruction JMP exécute un saut inconditionnel.
Les instructions JZ, JC, JS exécutent des sauts conditionnels. Elles
changeront la valeur de IP si les drapeaux ont la valeur appropriée. Si les
drapeaux n’ont pas la bonne valeur, l’instruction est ignorée et la prochaine
instruction est exécutée. Par exemple, JZ MonLabel sautera à l’instruction
indiquée par MonLabel si le drapeau Zéro est à 1.
L’instruction CMP A,B a le même effet qu’une soustraction sur les drapeaux,
mais elle ne change pas la valeur de A. Cette instruction est utile pour créer
des énoncés conditionnels du genre if(A != B). if(A != B) se traduirait par
CMP A,B, suivi de JNZ CodeAExecuterSiVrai.
La plupart des instructions de saut n’utilisent qu’un drapeau. Cependant,
certaines comparaisons (<,>) requièrent des tests sur deux drapeaux (Zéro
et (Overflow OU Carry)).
Les drapeaux utilisés pour évaluer une condition peuvent être différents si
les nombres comparés sont signés ou non-signés. Voir JG, JLE, JA…
GIF-1001
Cours 9, p.3
Instructions de saut (1 drapeau seulement)
JPSaut si pas de parité.JNP
JPE
PF = 0
Saut si parité impaire.JPO
JOOF = 0Saut si pas de débordement.JNO
JSSF = 0Saut si aucun signe (positif).JNS
JNAESaut si supérieur ou égal.JAE
JBSaut si pas inférieur.JNB
JC
CF = 0
Saut si pas de retenue.JNC
JESaut si différent.JNE
JZ
ZF = 0
Saut si pas zéro.JNZ
Saut si parité.JP JPOPF = 1
Saut si parité paire.JPE
JNOOF = 1Saut si débordement.JO
JNSSF = 1Saut si signe négatif.JS
JAESaut si ni supérieur ni égal.JNAE
JNBSaut si inférieur.JB
JNC
CF = 1
Saut si Retenue (inférieur).JC
JNESaut si égal.JE
JNZ
ZF = 1
Saut si zéro.JZ
GIF-1001
Cours 9, p.4
Exemple de boucle
Le code qui suit est un exemple de calcul de factoriel (Le nombre doit être
entre 0 et 8! = 40320 afin d’éviter un Overflow. Le nombre est dans CX au
début et la résultat est dans AX à la fin. Les registres BX et DX sont
modifiés par le programme.
GIF-1001
Cours 9, p.5
Sauts relatifs, absolus et indirects
L’instruction JMP Address est compilée comme étant une instruction
qui change IP par rapport à sa valeur actuelle: JMP Address est une
instruction qui effectue IP = IP + X, X étant la différence entre
l’adresse de l’instruction JMP Address et l’adresse de la destination
du saut. On parle de saut relatif (à la valeur de IP) parce que le
paramètre Address ne désigne pas une adresse de la mémoire,
mais plutôt un déplacement par rapport à l’adresse actuelle.
Un saut absolu est un saut dans lequel l’adresse de la destination
est indiquée entièrement dans l’instruction de saut (IP = adresse).
Les sauts absolus sont rares par rapport aux sauts relatifs: ils
prennent plus d’espace mémoire (il faut plus de bits pour décrire une
adresse absolue qu’un déplacement) et ils diminuent la modularité
du code.
L’instruction JMP Address est une instruction de saut direct: la
destination du saut est fixe et définie à même l’instruction. Le 8086
permet des sauts indirects, c’est-à-dire des sauts dont l’adresse de
destination est définie par un registre (exemple: JMP AX). Les sauts
indirects permettent d’implémenter plusieurs éléments des langages
de haut niveau comme les “switch case” ou les pointeurs de
fonction.
1 / 13 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !