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 mov ax,0 mov cx,100 boucle: inc ax 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 mov ax,@data mov ds,ax mov cx,5 mov si,0 vect: mov al,tab[si] mov tab2[si],al inc si loop vect 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 (?) result dw ? .code debut: mov ax,@data mov ds,ax mov cx,300 mov si,0 mov bx,1 ; chargement du vecteur charge: mov tab[si],bx inc bx add si,2 loop charge . . . . . . ;calcul de la somme des éléments mov ax,0 mov si,0 mov cx,300 somme: add ax,tab[si] add si,2 loop somme mov result,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) 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 : mov ax,@data mov ds,ax mov cx,24 ; cx reçoit la longueur de la chaîne de caractères mov si,-1 boucle: inc si mov al,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 less than 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 comparaison CMP A,B Condition Nb signés Nb non signés Jump si A = B JE ZF = 1 A < B JL SF ≠ OF JB CF = 1 A > B JG ZF = 0 et SF = OF JA CF = 0 et ZF = 0 A ≠ B JNE ZF = 0 A ≤ B JNG ZF = 1 ou SF ≠ OF JNA CF = 1 ou ZF = 1 A ≥ B JNL SF = OF JNB CF = 0
Mnémoniques à utiliser après une autre instruction arithmétique que CMP (exemple : ADD A,B) Condition Nb signés Nb non signés Jump si = 0 JZ ZF = 1 < 0 JS SF = 1 Pas de sens !! > 0 Utiliser JNZ et JNS JNZ ZF = 0 ≠ 0 ≥ 0 JNS SF = 0 Toujours ≥ 0 Dépassement de capacité JO OF = 1 JC CF = 1 Pas de dépassement de capacité JNO OF = 0 JNC CF = 0
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]