120 likes | 221 Views
Système d’exploitation : Assembleur. Semaine 09 Commandes de transfert Loops & Jumps. Commande de transfert : LOOP. LOOP permet de répéter un traitement un nombre de fois déterminé par la valeur contenue dans le registre compteur CX (boucle) Utilisation : LOOP label
E N D
Système d’exploitation : Assembleur Semaine 09 Commandes de transfert Loops & Jumps
Commande de transfert : LOOP • LOOP permet de répéter un traitement un nombre de fois déterminé par la valeur contenue dans le registre compteur CX (boucle) • Utilisation : LOOP label • Les indicateurs ne sont pas modifiés par LOOP • Fonctionnement : • LOOP décrémente CX de 1 puis teste le contenu de CX • Si CX est différent de 0, branchement au label (étiquette approchée - voir remarque ci-après) • Sinon, le programme continue de manière séquentielle • Remarque : LOOP occupe 2 octets en mémoire. Premier octet : code opération (E2) Deuxième octet : un déplacement relatif compris entre -128 et 127
LOOP - Exemple • Écrire une boucle qui incrémente 100 fois la valeur de AX .model small .code movax,0 movcx,100 boucle: incax loop boucle mov ah,4ch int 21h end
LOOP - Exemple • Copie des éléments d’un vecteur TAB vers un vecteur TAB2 .model small .data tab db 5,4,3,2,1 tab2 db 5 dup(?) .code movax,@data movds,ax movcx,5 mov si,0 vect: moval,tab[si] mov tab2[si],al inc si loopvect mov ah,4ch int 21h end
LOOP - Exemple • Créer un tableau contenant les entiers de 1 à 300. Calculer la somme des éléments du tableau. .model small .data tab dw 300 dup (?) resultdw ? .code debut: movax,@data movds,ax movcx,300 mov si,0 movbx,1 ; chargement du vecteur charge: mov tab[si],bx incbx add si,2 loop charge . . . . . . ;calcul de la somme des éléments movax,0 mov si,0 movcx,300 somme: addax,tab[si] add si,2 loop somme movresult,ax mov ah,4ch int 21h end debut
Commandes de transfert :Instructions LOOP conditionnelles • LOOPE (ou LOOPZ) • idem LOOP, mais il faut une double condition pour saut au label spécifié • CX != 0 et ZF=1 • LOOPNE (ou LOOPNZ) • idem LOOP, mais il faut une double condition pour saut au label spécifié • CX != 0 et ZF=0
LOOP conditionnel - Exemple • Recherche du caractère ‘c’ dans une chaîne de caractères • On va comparer le caractère en cours avec ‘c’.Pour savoir si la lettre ‘c’ a été trouvée ou pas, il faut tester la valeur de ZF.Si ZF=0, le caractère n’a pas été trouvé.Si ZF=1, le caractère a été trouvé.
Recherche du caractère ‘c’ dans une chaîne de caractères .model small .data chaine db “recherche du caractère c” .code debut : movax,@data movds,ax movcx,24 ; cx reçoit la longueur de la chaîne de caractères mov si,-1 boucle: inc si moval,chaine[si] sub al,’c’ ; ou cmp al,’c’ loopnz boucle ; boucle si pas trouvé et si pas atteint ; la fin de la chaîne de caractères mov ah,4Ch int 21h end debut
Commandes de transfert : Jcond(jump conditionnel) • JUMP transfère l’exécution du programme à l’adresse indiquée si la condition exprimée par le code opération est vérifiée. • Remarque : • Comme pour LOOP, le déplacement doit être court (-128 à +127). • Utilisation : Jcond label • on aura E pour equal Z pour zero G pour greater S pour sign flag = 1 L pour lessthan O pour overflow flag = 1 A pour above C pour carry flag = 1 B pour below P pour parity flag =1 N pour not
Mnémoniques à utiliser après une autre instruction arithmétique que CMP (exemple : ADD A,B)
Instruction de branchement inconditionnel : JMP • Instruction de branchement inconditionnel à l’adresse spécifiée • Contrairement à Jcond, JMP peut brancher vers n’importe quel emplacement mémoire • 2 grandes catégories de branchements : • intrasegment (seul IP est modifié) • intersegments (CS et IP sont modifiés) • Pour ces 2 catégories, il existe JMP direct ou JMP indirect • JMP intrasegment direct cas le plus simple et le plus courant • l’opérande est un symbole near • near signifie à l’intérieur du segment • near est lié au symboles suivi de « : » Si symbole est un short label (-128 à +127), JMP est codé sur 2 octets Sinon, JMP codé sur 3 octets (1 pour code opération et 2 pour le déplacement) • JMP intrasegment indirect L’opérande n’est pas un symbole near, mais un registre ou une référence à une donnée en mémoire. JMP indirect = l’opérande contient l’adresse de branchement exemple : JMP table[SI]