Programmation en assembleur
lotfi de
Messages postés
99
Statut
Membre
-
lotfi de Messages postés 99 Statut Membre -
lotfi de Messages postés 99 Statut Membre -
en l'assembleur et sur tout dans le instruction de sauts conditionnels
l'orsque j'ecris
JNZ suite
move AX,5
mov BH,4
svp vous pouvez de m'explique comment PC execute c instruction la et comment
l'orsque j'ecris
JNZ suite
move AX,5
mov BH,4
svp vous pouvez de m'explique comment PC execute c instruction la et comment
1 réponse
-
Bonjour,
Que veux-tu dire exactement? L'exécution de l'instruction de saut conditionnel dépend du registre de flags qui est lui-même influencé par les opérations précédentes, invisibles dans la suite que tu donnes. L'instruction "Mov" quant à elle, n'influence pas le registre de flags...
Et fait attention à ton orthographe si tu veux bien, c'est pas très compréhensible comme t'écris et puis t'en viens même à faire une faute dans les instructions "move"!-
-
Oui, en fait ça n'a pas de sens de commencer par l'instruction de saut conditionnel: il faut comprendre le fonctionnement dans son ensemble pour que ce soit clair: parmi les registres spéciaux du processeur il y a un registre de flags (drapeaux) qui contient différents bits ayant une signification précise. La plupart des instructions du proc. influencent ce registre de flags, et ce en fonction du résultat du calcul que tu leur donne, ce registre permet donc de récupérer différentes informations sur le résultat, par exemple s'il vaut 0, s'il est négatif ou bien s'il a débordé du registre destination... Une fois que le registre de flags a été influencé par une instruction, on peut donc exploiter ces informations grâce à une instruction de saut, par exemple l'instruction "jnz" que tu emploie saute tant que le dernier résultat calculé est différent de 0...
Exemple:Mov EAX,02 // On part avec EAX valant 2 @Bcl: Dec EAX // Décrémente EAX Jnz @Bcl // Saute à "@Bcl" si le résultat est différent de 0
// La boucle va donc être exécutée deux fois, EAX valant 1 puis 0...
// Ici EAX vaut 0Inc EAX // EAX vaut maintenant 1 Jz @Suite // Donc pas de saut Dec EAX // EAX redescend à 0 Jz @Suite // Donc cette fois le saut va se faire Ret @Suite:
-
-
Hé bien du côté des comparaisons, tu peux employer l'instruction Cmp:
En fait Cmp fait un "Sub" entre les deux valeurs, sans retenir le résultat...
Par exemple:Cmp EAX,ECX // C'est à dire: Sub EAX,ECX Jz @Suite // Saute si EAX et ECX sont égaux, le résultat a donné 0 Cmp EAX,10 Jz @Suite // Saute si EAX vaut 10
La prise en compte du signe change le résultat, il y a donc des sauts conditionnels que le prenne en compte et d'autres non.Cmp EAX,ECX Jb @Suite // Saute si EAX est inférieur à ECX non-signés Cmp EAX,ECX Jl @Suite // Saute si EAX est inférieur à ECX signés
Il y a aussi l'instruction "Test" (equivalent de "And" cette fois), qui permet de faire des tests très pratiques:Test EAX,03 // Test les bits 1 et 2 Jnz @Suite // Saute si l'un des bits concerné est différent de 0
Et pour savoir si un registre vaut 0 ou non le plus pratique est de faire:And EAX,EAX ou Test EAX,EAX Jz @Suite // Saute si le registre vaut 0
-
-