Assembleur IUT LENS 2002 L’opérande XOR l XOR Destination, Source l Cette instruction ré alise un OU Exclusif entre la source et la destination. On l’utilise très souvent pour effacer un registre (Xor sur lui-mê me) Les instructions logiques MOV AH,00111100 XOR AH,11001100 => AH = 11110000 Assembleur - IUT LENS 2002 Les instructions logiques l l Les instructions logiques sont é quivalentes aux portes de base utilisé es dans les circuits logiques. Assembleur - IUT LENS 2002 L’opérande NOT l NOT source l Cette opé ration effectue un NON logique sur source. L’assembleur possède donc les instructions é lé mentaires à partir desquelles on peut obtenir l’ensemble des cas possibles. Mov AH,11001101 NOT AH => AH 00110010 Assembleur - IUT LENS 2002 Assembleur - IUT LENS 2002 L’opérande AND Assembleur IUT LENS 2002 l AND destination, source l Cette opé ration effectue un ET logique entre destination et source. Structures Conditionnelles et de Boucles Mov AH,11001101 Mov AL,00111100 AND AH,AL => AH 00001100 Assembleur - IUT LENS 2002 L’opérande OR Assembleur - IUT LENS 2002 Le fonctionnement. l OR destination, source l Cette opé ration effectue un OU logique entre destination et source. l l Le rô le d’une structure conditionnelle est d’orienté le programme en fonction du ré sultat d’un test dans les langages de haut niveau ou d’une opé ration arithmé tique en assembleur. La plus connue é tant le SI … ALORS … SINON Mov AH,11001101 Mov AL,00111100 OR AH,AL => AH 11111101 Assembleur - IUT LENS 2002 Assembleur - IUT LENS 2002 En Assembleur ? l l Les Labels Il n’existe aucune structure conditionnelle de ce type mais on peut contourner ce problème. l Il est possible en assembleur de nommer des lignes de codes. – – L’instruction SI ALORS SINON des langages de haut niveau se transforme en plusieurs instructions assembleur. Soit par un dé placement relatif dans le code, mais qui risque de changer à chaque compilation Soit par un label pré cé dant la ligne de code, à la charge du compilateur de transformer ce label en dé placement VotreNom : Instruction Asm Assembleur - IUT LENS 2002 Algorithme général l Assembleur - IUT LENS 2002 L’instruction CMP On peut ré sumer la transformation du SI ALORS SINON sous cette forme d’instructions é lé mentaires. SI => Opé ration de Test ou Arithmé tique. ALORS => Test d’un indicateur et Saut à une autre endroit SINON => Suite du programme l CMP destination, source l Cette opé ration effectue l’opé ration SUB mais n’affecte pas le ré sultat dans destination. Elle sert à comparer les deux opé randes. l Assembleur - IUT LENS 2002 Ce qui donne en ASM … MOV AL,0FFH CMP AL,0 JA Label1 … … … ..… … . … … … … … ... Label1 : … … .. … … … … … . AL = OFFH; Assembleur - IUT LENS 2002 L’instruction TEST l TEST destination, source l L’instruction TEST effectue la mê me opé ration que le ET logique, sauf qu’aucun ré sultat n’est stocké dans destination. l On se sert de cette instruction pour dé terminer la position d’un ou plusieurs bits. SI AL > 0 ALLER A Label1 … … .. … … .. Label1 :… … … … … … … … … … … . Assembleur - IUT LENS 2002 Les instructions de Test l Toutes les instructions positionnant les Flags peuvent servir de Test. l Il existe cependant 2 instructions spé cifiques de test qui ont l’avantage, par rapport aux instructions arithmé tiques, de ne pas modifier les opé randes. Assembleur - IUT LENS 2002 Assembleur - IUT LENS 2002 Les instructions de Saut l Ils existent deux instructions de saut : l’une conditionnelle Jcond et l’autre inconditionnelle JMP. l Dans le cadre des structures conditionnelles, on utilise Jcond où cond repré sente une des conditions suivantes. Jcond Label Assembleur - IUT LENS 2002 Les conditions non signées Condition Description Quelques exemples (1) Flag testé A / NBE Supé rieur / Pas infé rieur ni é gal CF ou ZF = 0 AE / NB Supé rieur ou é gal / Pas infé rieur CF = 0 B / NAE Infé rieur / Pas supé rieur ni é gal CF ou ZF = 1 BE / NA Infé rieur ou é gal / Pas supé rieur CF ou ZF = 1 C Carry é gal à 1 CF = 1 NC Carry é gal à 0 CF = 0 Parité / Parité paire PF = 1 Pas de parité / parité Impaire PF = 0 P / PE NP / PO Label1: Label2: JMP Label2 While (a < 5) { INC B B++; INC A A++; CMP A,5 JL Label1 } Assembleur - IUT LENS 2002 Conditions Signées Condition Description Assembleur - IUT LENS 2002 Quelques Exemples (2) Flag testé G / NLE Supé rieur / Pas infé rieur ni é gal ((SF xor OF) ou ZF) = 0 GE / NL Supé rieur ou é gal / Pas infé rieur (SF xor OF) = 0 L / NGE Infé rieur / Pas supé rieur ni é gal (SF xor OF) = 1 LE / NG Infé rieur ou é gal / Pas supé rieur ((SF xor OF) ou ZF) = 1 O Overflow é gal à 1 OF = 1 NO Overflow é gal à 0 OF = 0 S Signe positif SF = 1 NS Signe né gatif SF = 0 Do { Label1: DEC B B--; INC C C++; CMP B,0 } JL Label1 While (B!=0); Assembleur - IUT LENS 2002 Condition sur Zéro Assembleur - IUT LENS 2002 Quelques exemples (3) Label1: Condition E/Z NE / NZ Description Flag testé Egal / Zé ro ZF = 1 Pas é gal / Pas Zé ro ZF = 0 MOV C,0 For (c=0;c<10;c++) CMP C,10 {; JG Label2 A = A +B; ADD A, B INC C JMP Label1 } Label2 Assembleur - IUT LENS 2002 L’instruction JMP l Assembleur - IUT LENS 2002 L’instruction LOOP JMP Label Cette instruction effectue un saut inconditionnel vers Label. attention comme dans tout programme si vous cré er une boucle vé rifiez bien que le code permette d’en sortir. l Assembleur - IUT LENS 2002 l L’instruction loop permet de gé rer des boucles for, en utilisant le registre de « boucle » CX. l A chaque tour de boucle CX est dé cré menté . l Dès que le registre arrive à 0 l’instruction suivante est exé cuté e, sinon on remonte au label de dé but de boucle. Assembleur - IUT LENS 2002 Exemple d’utilisation de Loop Notion de segment Start : For : MOV CX,10 … … … … … . LOOP For l Un segment est un bloc de mé moire continue (que l’on peut parcourir liné airement du dé but à la fin) Equivaut à For (i=10;i>0.i--) { … l Des segments peuvent se chevaucher. l Il peut y en avoir autant que né cessaire. l } Assembleur - IUT LENS 2002 Assembleur IUT LENS 2002 Assembleur - IUT LENS 2002 L’OFFSET d’une adresse l Il repré sente un dé placement par rapport à la base du segment associé . l L’offset et le segment composent l’adresse logique (ou segmenté e) d’une variable. La Mé moire Assembleur - IUT LENS 2002 La mémoire et les variables l La mé moire et les diffé rents modes d’accès vont nous permettre d’aller plus loin dans l’utilisation de l’assembleur. l Les registres é tant limité s en nombre et à des longueurs de 16 bits maximum, la mé moire permet de stocker des informations sur des tailles plus importantes. Assembleur - IUT LENS 2002 L’adresse physique l Pour obtenir l’adresse physique à partir de l’offset et d’un segment, il suffit d’appliquer la formule suivante. ADRESSE PHYSIQUE = SEGMENTS *16 + OFFSET l On obtient alors une adresse sur 20 bits permettant d’adresser jusqu’à 1 Mo pour le mode ré el. Assembleur - IUT LENS 2002 La mémoire est « quasi-illimitée » l l Comment y accé der ? Si on utilise l’ancien système (ie un registre 16 bits pour repré senter une adresse mé moire on arrive à une limite de 64Ko). Les 80X86 ont donc une mé thode plus compliqué e qui remonte à l’é poque où des registres supé rieurs à 16 bits é taient « irré alisables ». Assembleur - IUT LENS 2002 Assembleur - IUT LENS 2002 Le mode protégé l La mé moire actuelle dé passant allé grement le Mo maintenant il faut pouvoir y accé der é galement. l Pour cette raison un deuxième mode de repré sentation des adresses mé moire est apparu à partir du 286. l Nous y reviendrons lorsque nous é tudierons les é volutions de l’assembleur. Assembleur - IUT LENS 2002 Comment nommer une variable l Le nommage des variables obé it à certaines règles. Son nom doit en effet : – – l Quelques exemples de déclarations l Nombre1 DD 12345678 Caractère DB ‘a’ Nombre2 DW 1234H Inconnu DD ? Inconnu2 DB 5 DUP (0) Contenir des lettres, des chiffres ou des caractères spé ciaux ? @ _ (La casse n’a pas d’importance). Commencer par une lettre ou un caractère spé cial. La longueur maximale est de 255 caract ères mais seul les 31 premiers sont significatifs. Exemples de dé clarations dans la section .DATA l La famille des processeurs 80X86 utilise la repré sentation « LITTLE ENDIAN » c’est-à-dire que l’on commence par le poids faible des donné es. Assembleur - IUT LENS 2002 Les types de variables Assembleur - IUT LENS 2002 Représentation Mémoire l Dans les langages de haut niveau, il est possible de « typer » une variable. En assembleur, il s’agit plutô t d’indiquer la taille de cette dernière qui pourra contenir n’importe quelle information. l Attention, l’absence de typage implique que vous interpré tiez correctement votre variable, le compilateur ne vous sera d’aucune aide la-dessus. l Pour les exemples pré cé dents on obtient alors la repré sentation mé moire suivante. Chacune des cases repré sente un octet (8 bits) Adr ? N+8 ? ? 0 0 0 Adr N 56 34 12 ‘a’ 34H 12H ? 78 Assembleur - IUT LENS 2002 Les différentes tailles de variables DB DW Octet Word 8 bits 16 bits DD DP DQ DT Double Word Pword Quad Word 10 bytes 32 bits 48 bits 64 bits 80 bits 0 0 Assembleur - IUT LENS 2002 L’instruction DUP l L’instruction DUP est très pratique pour initialiser un tableau. l Soit a une valeur initiale comme dans l’exemple : Variable Type NbCase DUP (Valeur) l Soit pour ré server une zone mé moire qu’on affectera plus tard. Variable Type NbCase DUP (?) Assembleur - IUT LENS 2002 L’initialisation des variables l Assembleur - IUT LENS 2002 Assembleur IUT LENS 2002 Pour initialiser vos variables on distingue 4 repré sentations « entière »+ 2 flottantes – – – – Nombre dé cimal : Suite de chiffres suivie ou non de D Nombre Hexadé cimal : Suite de Chiffres ou de A..F et suivie de H ASCII : Suite de caractères encadré e par des apostrophes « ‘» Inconnue : Suite de points d’interrogation Assembleur - IUT LENS 2002 Les diffé rents modes d’adressages Assembleur - IUT LENS 2002 Comment accéder aux variables l l On sait dé finir des variables mais comment y accé der lorsqu’elles ne correspondent pas aux registres ? Ce sont les diffé rentes solutions d’adressages qui vont vous permettre de travailler sur vos variables. L’adressage direct l Cet adressage travaille directement sur la mé moire, soit en lecture soit en é criture. l Exemple : Mov [input],ax Mov AX,[input] l Aucun contrô le n’est effectué c’est-à-dire que si AX dé passe la capacité d’INPUT vous é craserez la zone suivante, avec les risques que cela comporte. Assembleur - IUT LENS 2002 Obtenir son adresse mémoire l l Vous avez dé jà vu lors du cours pré cé dent l’instruction OFFSET qui vous permet de ré cupé rer l’OFFSET d’une variable mé moire. Cet OFFSET associé au segment de donné es correspondant vous donnera une adresse physique. Mov AX,OFFSET Var1 Assembleur - IUT LENS 2002 L’adressage indirect de registre l Cette mé thode est une fusion de l’adressage de registre et de l’adressage direct. l Exemple : Mov BX,OFFSET INPUT Mov AX,[BX] l Dans cet exemple, on affecte à AX le contenu de la mé moire pointé e indirectement par BX. Assembleur - IUT LENS 2002 L’adressage de registre L’adressage indexé direct l C’est l’adressage que vous avez utilisé jusqu’ici : Il ne fait intervenir que des registres. l Exemple : Mov BX,CX l Assembleur - IUT LENS 2002 l On utilise un registre d’index SI ou DI pour incré menter l’offset. l Exemple : Mov AL,[INPUT + DI] Mov [INPUT + DI],AL Remarque : Les registres doivent ê tre de mê me taille. Assembleur - IUT LENS 2002 L’adressage Immédiat Assembleur - IUT LENS 2002 L’adressage indexé de base l Là encore, c’est un des modes que vous avez dé jà utilisé : il fait intervenir un registre en é criture et une valeur. l Exemple : l Avec cette mé thode d’adressage, on utilise en plus un registre de base en gé né ral BP. l Exemple : Mov AL,[INPUT +BP +DI] Mov [INPUT +BP +DI],AL MOV AX,12 MOV AX,6000 l Remarque : – La valeur doit ê tre d’une taille é quivalente ou infé rieure au registre utilisé . – Mov 12,AX est bien entendu impossible … .. Assembleur - IUT LENS 2002 l ATTENTION : En Utilisant BP comme registre de base le segment par dé faut est SS et non plus DS. Pour vous repositionner sur DS il faut alors utiliser la syntaxe suivante : Mov AX,DS:[INPUT + BP + DI] Assembleur - IUT LENS 2002 L’adressage de base l l L’instruction PUSH Similaire à l’adressage indirect de registre auquel on rajoute un constante de dé placement. l l SP est dé cré menté de 2 pour une valeur de 16 bits ou de 4 pour une valeur de 32 bits à chaque fois que l’on empile une valeur. l La pile n’accepte que les valeurs sur 16 bits ou 32 bits. Exemple : Mov AX,[BX+2] Mov [BX+2],AX PUSH source L’instruction PUSH dé pose sur la pile la valeur de source. Assembleur - IUT LENS 2002 Assembleur IUT LENS 2002 La pile et ses fonctions Assembleur - IUT LENS 2002 Deux variantes utiles du PUSH l PUSHF : Cette instruction sans paramètre permet de sauvegarder le registre des indicateurs. l PUSHA : Cette instruction, é galement sans paramètre, sauvegarde l’ensemble des registres gé né raux ie : AX, CX, DX, BX, SP, SP, SI, DI Assembleur - IUT LENS 2002 A quoi sert la pile ? l Assembleur - IUT LENS 2002 L’instruction POP La pile a plusieurs fonctions : – – Elle vous permet de « sauvegarder » les valeurs de registres sans forcé ment recourir à des variables mé moires. Elle sert de sauvegarde du contexte lors de l’appel à des sous programmes ou interruption. l POP destination L’instruction POP retire de la pile la valeur du sommet et la stocke dans destination. l SP est incré menté de 2 pour une valeur de 16 bits ou de 4 pour une valeur de 32 bits à chaque fois que l’on dé pile une valeur. l Destination doit ê tre de taille 16 bits ou 32 bits. Assembleur - IUT LENS 2002 Comment fonctionne une pile ? l Deux instructions POP et PUSH (respectivement Dé piler / empiler) l La taille de la pile est dé finie par la directive STACK l Elle fonctionne suivant le principe LIFO (Last in First Out) Assembleur - IUT LENS 2002 Assembleur - IUT LENS 2002 Les variantes de POP l POPF : Restaure le registre des indicateurs qui aura é té pré alablement sauvegardé par PUSHF. l POPA : Restaure l’ensemble des registres gé né raux qui aura é té pré alablement sauvegardé par PUSHA. Assembleur - IUT LENS 2002 Rappel sur les piles (1) l Il faudra toujours veiller àdé piler l’ensemble des valeurs dans le sens inverse de celui que vous avez utilisé pour les empiler. Push AX Push BX … … … .. Pop BX Pop AX Assembleur - IUT LENS 2002 Rappel sur les piles (2) l Il ne faudra jamais laisser ou oublier des valeurs sur la pile (en particulier dans les sous programmes ou procé dure). l N’oubliez pas non plus que certaines instructions assembleur vont é galement se servir de la pile pour sauvegarder le contexte. l Et toujours se rappeler qu’il n’y a aucun contrô le d’effectuer sur la cohé rence de votre code… . Toute erreur est donc susceptible de provoquer un beau plantage. Assembleur - IUT LENS 2002