12
Système d’exploitation : Assembleur Semaine 09 Commandes de transfert Loops & Jumps

Système d’exploitation : Assembleur

  • 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

Page 1: Système d’exploitation : Assembleur

Système d’exploitation : Assembleur

Semaine 09Commandes de transfert

Loops & Jumps

Page 2: Système d’exploitation : Assembleur

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

Page 3: Système d’exploitation : Assembleur

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

Page 4: Système d’exploitation : Assembleur

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

Page 5: Système d’exploitation : Assembleur

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

Page 6: Système d’exploitation : Assembleur

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

Page 7: Système d’exploitation : Assembleur

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é.

Page 8: Système d’exploitation : Assembleur

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

Page 9: Système d’exploitation : Assembleur

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

Page 10: Système d’exploitation : Assembleur

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

Page 11: Système d’exploitation : Assembleur

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

Page 12: Système d’exploitation : Assembleur

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]