Upload
tyra
View
34
Download
4
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
Système d’exploitation : Assembleur
Semaine 09Commandes 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
.codemov ax,0mov cx,100
boucle: inc axloop bouclemov ah,4chint 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 siloop 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 ?
.codedebut:
mov ax,@datamov ds,axmov cx,300mov si,0mov bx,1
; chargement du vecteurcharge:
mov tab[si],bxinc bxadd si,2loop charge
. . .
. . .
;calcul de la somme des élémentsmov ax,0mov si,0mov cx,300
somme:add ax,tab[si]add si,2loop sommemov result,ax
mov ah,4chint 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
.datachaine db “recherche du caractère c”
.codedebut : mov ax,@data
mov ds,axmov cx,24
; cx reçoit la longueur de la chaîne de caractèresmov si,-1
boucle: inc simov 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,4Chint 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 Jump si
A = B JE ZF = 1 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 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 Jump si
= 0 JZ ZF = 1 JZ ZF = 1
< 0 JS SF = 1 Pas de sens !!
> 0 Utiliser JNZ et JNS JNZ ZF = 0
≠ 0 JNZ ZF = 0 JNZ ZF = 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 directcas 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 octetsSinon, JMP codé sur 3 octets (1 pour code opération et 2 pour le déplacement)
• JMP intrasegment indirectL’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 branchementexemple : JMP table[SI]