Microprocesseurs & Microcontrôleurs Lotfi BOUSSAID Département de Génie Électrique Ecole Nationale d’Ingénieurs de Monastir [email protected] 2016 - 2017 Assembleur 8086 Mode d’adressage Mode d’adressage • Les instructions peuvent avoir 0, 1, ou 2 opérandes. Exemples : Instructions sans opérande: NOP, STI, CLI, PUSHF, CBW...; Instructions avec une seule opérande: INC, DEC, NEG, NOT ....; Instructions avec deux opérandes: CMP, ADD, MOV, LEA, XCHG, AND ...... - Une opérande peut se trouver dans un registre du 8086, dans un octet, dans un mot 16 bits ou dans un double mot 32 bits - Les opérations peuvent avoir lieu: o Entre un registre et un autre registre, Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 2 Assembleur 8086 Mode d’adressage Entre un registre et un octet ou un mot en mémoire mais pas entre 2 octets ou 2 mots en mémoire (il faut passer dans ce cas par un registre). Toutefois les instructions de mouvement de chaînes d'octets effectuent "directement" le transfert de mémoire à mémoire (octet par octet ou mot par mot), l'adressage se faisant par les registres DS:SI et ES:DI. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 3 Assembleur 8086 Mode d’adressage Les instructions de transfert Adressage registre à registre : Exemple: MOV AX, BX ADD CH, DL Adressage immédiat : Exemples: MOV AX, 0A1EBH ADD CL, 25 OR AH,11000000 ; opérandes 16 bit ; opérandes 8 bits ; AX:= valeur hexa A1EB ; CL:= CL + 25 ; forcer les 2 bits de fort poids de AH à 1 Adressage direct : Exemples: MOV BX,Total MOV DX,ES:Nom Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 4 Assembleur 8086 Mode d’adressage Les instructions de transfert Adressage indirect (ou basé) : Exemples: MOV AX,[BX] MOV AX,[BP] Adressage indexé : Exemple: MOV AX,Tab[SI] Adressage indirect indexé (ou basé indexé) : Exemples: MOV AX,[BX][SI] ; relatif a DS MOV AX,[BP][SI] ;Relatif a SS Adressage basé indexé avec déplacement. Exemple: MOV AX,Compte[BX][SI] Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 5 Assembleur 8086 Les Principales Instructions de l’assembleur L’instruction LEA Exemples: LEA BX,Tableau ;chargement de l’adresse de Tableau LEA BX,Tableau[SI] L'instruction XCHG : Exemple: XCHG AX,Somme ;échange des contenus de AX et de Somme Les instructions PUSH et POP Exemple: PUSH SI Lotfi BOUSSAID ;empile le contenu de SI Microprocesseurs & Microcontrôleurs 6 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions arithmétiques Les instructions d'addition ADD et ADC. Exemples: ADD AX,BX ADD AX,0F00H ADC DX,0 ;AX reçoit AX + BX ;ces 2 instructions additionnent la ;valeur immédiate 0F00H à la paire de ;registres DX:AX (32 bits) avec addition de la retenue Cy. Les instructions de soustraction SUB et SBB : SUB AX,DX SBB SI,100 ;AX reçoit AX-DX ;SI reçoit SI-100 - Carry Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 7 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de multiplication: MUL et IMUL Exemples: MUL CL ; AX:=AL * CL résultat sur 16 bits IMUL CX ; DX:AX:= AX * CX résultat sur 32 bits non signe Les instructions de division: DIV et IDIV Exemples: IDIV BX ;DX:AX est divisé par BX, le reste est dans DX et le quotient dans AX DIV BL ;AX est divisé par BL, le reste est dans AH, le quotient dans AL. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 8 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de décalage et de rotation Les instructions de décalage gauche :SHL Opérande,Nombre Opérande: Opérande = registre / case mémoire Nombre: Nombre = soit la valeur 1, soit la valeur contenue dans CL Les instructions de décalage droite :SHR Opérande,Nombre Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 9 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de rotation gauche : ROL Opérande , Nombre Les instructions de rotation gauche :ROR Opérande , Nombre Les instructions de rotation gauche avec retenu :RCL Opérande , Nombre Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 10 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de rotation droite avec retenu :RCR Opérande,Nombre Les instructions logiques AND, OR et XOR Syntaxe: AND Destination , Source OR Destination , Source XOR Destination , Source Destination = registre / case mémoire Source = registre / valeur immédiate / case mémoire à condition que Destination ne soit pas une case mémoire. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 11 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions logiques AND, OR et XOR Exemples: • • • AND AX, FFF0H OR AL, 1 AND AX, Masque • • XOR AX,-1 TEST BX, FFFE 0011 OR 0 1 0 1 0111 AND ;met à 0 les 4 bits de faible poids de AX ;met à 1 le bit de faible poids de AL ;fait un ET logique entre le contenu de AX ;et celui de Masque, le résultat est dans AX ;fait le complément à 1 de AX ; fait un ET logique entre le contenu de BX ;et 0FFFE sans modifier BX. Permet de ;tester le bit 1 de BX 0011 0101 XOR 0001 Lotfi BOUSSAID 0011 0101 0110 Microprocesseurs & Microcontrôleurs 12 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de comparaison Syntaxe: CMP Destination , Source TEST Destination , Source Destination = registre / case mémoire Source = registre / case mémoire / valeur Exemples: • • • CMP AL,CL CMP AL,0 TEST AL,AH ; compare AL à CL ; compare AL à 0 ; ET logique entre AL et AH Remarque: TEST laisse les opérandes du ET logique inchangées; les indicateurs sont positionnés en fonction du résultat du ET logique. Lotfi BOUSSAID Microprocesseurs Microprocesseurs & Microcontrôleurs 13 13 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de saut. Saut inconditionnel: Exemple: JMP Cas1 JMP [BX] ;saut direct ;saut indirect à l'adresse contenue dans BX Les instructions de saut testant un flag. Saut conditionnel : JC / JNC JS / JNS JO / JNO JP / JNP JZ / JNZ Jump if Carry / not Carry Jump if Sign/ not Sign Jump if Overflow / not Overflow Jump if Parity / not Parity Jump if Zero / not Zero Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 14 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de saut sur test arithmétique signé. JE JNE JG JGE JL JLE Jump if Equal Jump if Not Equal Jump if Greater Jump if Greater or Equal Jump if Less Jump if Less or Equal Les instructions de saut sur test arithmétique non signé. JA JAE JB JBE Jump if Above Jump if Above or Equal Jump if Below Jump if Below or Equal Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 15 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions de boucle: LOOP, LOOPE et LOOPNE. Syntaxe: LOOP LOOPE LOOPNE etiquette etiquette etiquette Exemple: Sommation des éléments de 0 à 100 Assembleur: _sommation proc near MOV CX,100 MOV AX,0 Boucle: ADD AX,CX LOOP Boucle _sommation endp Lotfi BOUSSAID langage ‘C’: int near sommation(void) { int x=0; _CX=100; do { x=x+_CX; _CX=_CX-1; } while (_CX!=0); return(x); Microprocesseurs & Microcontrôleurs 16 Assembleur 8086 Les Principales Instructions de l’assembleur Les instructions sur chaînes de caractères MOVS (ou MOVSB, MOVSW), CMPS, SCAS, LODS et STOS Exemple: Assume CS: Code DS: Data Data Segment table_1 db 5 dup(?) table_2 dw 4 dup(?) initial_1 db 1,2,5,4,9 initial_2 dw 1000,1002,1005,1008 Data ENDS Code Segment @1: mov ax,data ;initialisation segment de ;données mov ds,ax mov es,ax mov cx,5 ; 5 élément à transférer Cld ; transfert dans le sens croissant Lotfi BOUSSAID mov si,offset initial_1 mov di,offset table_1 rep movsb mov cx,4 mov si,offset initial_2 mov di,offset table_2 rep movsw mov ah,4ch int 21h ; adresse du tableau source dans SI ; adresse du tableau destination dans DI ; transfert des éléments de initial_1 vers ; table_1 ; nombre d’éléments à transfere ; adresse du tableau source dans SI ; adresse du tableau destination dans DI ; transfert des éléments de initial_2 vers ; table_2 ; Fin du programme et retour au système ; d’exploitation Code Ends End @1 Microprocesseurs & Microcontrôleurs 17 Assembleur 8086 Notion de procédure Instructions CALL et RET. L'instruction CALL effectue donc les opérations : Empiler la valeur de IP. A ce moment, IP pointe sur l'instruction qui suit le CALL ; Placer dans IP l'adresse de la première instruction de la procédure (donnée en argument). Et l'instruction RET : Dépiler une valeur et la ranger dans IP. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 18 Assembleur 8086 Exemple: Calcul PROC instruction1 instruction2 RET Calcul ENDP near ; procedure nommée Calcul ; instructions ; instructions ; dernière instruction ; fin de la procédure CALL address PC (SP) (SP) – 1 SP PC (PC) + 3 (PC)H (PC)L (SP) - 2 address Lotfi BOUSSAID RET PCL PCH SP ;Retour de sous-prog ((SP) + 1) ((SP) + 2) (SP) + 2 Microprocesseurs & Microcontrôleurs 19 Assembleur 8086 Exemple: SOMME PROC NEAR ADD AX, BX RET SOMME ENDP ; AX <- AX + BX ; fin de la procédure Et puis son appel, par exemple pour ajouter 6 à la variable Truc : MOV AX, 6 MOV BX, Truc CALL SOMME MOV Truc, AX Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 20 Assembleur 8086 Title : les procédures Pile segment stack dw 100 dup (?) Basedepile equ thisword Pile ends data segement message db ’bonjour, monde!’, 10,13, ‘$’ data ends code segment assume cs:code, ds:code, ss:pile debut: MOV AX, data MOV DS, AX MOV AX, Pile MOV SS, AX MOV SP, basedepile boucle: MOV CX,12 call ecritmessage LOOP boucle mov AX, 4C00h INT 21H ; initialise le segment de pile ; appel de procédure ; décrementer CX de une unité et aller à ; boucle si CX est différent de 0 ; terminer le programme ici par le retour au DOS Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 21 Assembleur 8086 Title : les procédures ecritmessage proc near ;notre fonction mov ah, 09h move dx,offset message int 21h ret ecritmessage endp ; fin de la procédure/fonction code ends end debut ; fin du segment de code ; fin de la porte d’entrée Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 22 Assembleur 8086 Déclaration de variables Les variables se déclarent de la manière suivante: datas1 db ? ; datas1 est un byte non initialisé datas2 db 0FFh ; datas2 est un byte initialisé à FF (255 en hexadécimal) datas3 dw ? ; datas3 est un word (16 bits) datas4 db 5 dup (?) ; datas4 est un tableau de 5 bytes non initialisés datas5 dw 10 dup (15) ; datas5 est un tableau de 10 byte initialisés à 15 De manière générale: DB : 1 byte (8 bits) (Declare Byte) DW : 1 word (16 bits) (Declare Word) DD : 2 words (32 bits) (Declare Double) DF,DP : 6 bytes DQ : 8 bytes (64 bits) DT : 10 bytes Les constantes peuvent être écrites en: - décimal: 1, 2, 3, 123, 45 - hexadécimal : 1h,2h,3h,12h,0Fh,0AD4h (noter la présence du 0 quand le premier chiffre du nombre en hexadécimal commence par une lettre) - binaire : 1b,0b,1010b,111101b Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 23 Assembleur 8086 Les entrées Sorties en assembleur • Pour réaliser les opérations standards (affichage, saisie), le système d’exploitation (ici DOS) fournit les fonctions pré-écrites suivantes: • • • Affichage d’un caractère : mov DL, “A” ; caractère A est transfère dans DL mov AH, 2 ; fonction no. 2 int 21h ; appel au DOS Affichage d’une chaine de caractères : mov DX, offset chaine ; pointe vers l’adresse du premier caractère de ; la chaîne de caractères chaine mov AH, 09h ; fonction no. 9 int 21h; Saisie d’un caractère : mov AH, 1 ; fonction no. 1 (avec écho) int 21h ; résultat est mis dans AL Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 24 Assembleur 8086 Les entrées Sorties en assembleur • Saisie d’un caractère mov AH, 7 int 21h ; fonction no. 7 (sans écho) ; résultat dans AL • Arrêt de programme: mov AX, 4C00h ; int 21h ; À mettre à la fin de chaque fin programme; c’est l’équivalent du return (0) en C. Ces instructions ont pour effet de retourner au DOS. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 25 Assembleur 8086 L’équivalent de quelques instructions du langage C en assembleur • if then else If ax =1 bx = 10; else { bx = 0; cx = 10; } Assembleur if: CMP AX, 1 JNZ Else Then: MOV BX,10 JMP endif Else: MOV BX,0 MOV CX,10 endif: .............. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 26 Assembleur 8086 L’équivalent de quelques instructions du langage C en assembleur • La boucle FOR Assembleur • For (k=0; k<=10; k++) • bx = bx + k; For: MOV BX,0 MOV CX,0 CMP CX,10 JA Endfor ADD BX,CX INC CX JMP For Endfor: Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 27 Assembleur 8086 L’équivalent de quelques instructions du langage C en assembleur • WHILE Assembleur • bx = 5 • while (bx >0) bx = bx -1; MOV BX,5 CMP BX,0 JLE Endwhile DEC BX JMP while while: Endwhile: Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 28 Assembleur 8086 L’équivalent de quelques instructions du langage C en assembleur • SWITCH Assembleur switch (n) { case 1: ....; break; case 2: .....; break; default: .....; } CMP n,1 JNE case2 ............ JMP endswitch case2: CMP n,2 JNE default .......... JMP endswitch default: ........... endswitch: ........... Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 29 Assembleur 8086 L’équivalent de quelques instructions du langage C en assembleur Écrire le code de l’instruction if (a>b) && (c <= d) { ................ } En assembleur if: cmp a, b jng endif cmp c, d jnle endif .............. endif: Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 30 Assembleur 8086 Liste des registres les plus utilisés A. Registres généraux • AX (A pour accumulateur): joue le rôle d’opérande implicite dans plusieurs opérations: MUL, DIV, INC, etc. • CX (C pour compteur): est utilisé pour les boucles (instruction LOOP). • DX: utilisé dans les multiplications et divisions comme registre d’extension. • SI (Source Index): souvent utilisé comme pointeur sur une adresse mémoire (exemple: MOV AL, [SI]). Il est très utilisée avec les instructions de traitement de chaînes de caractères (LODS). • DI (Destination Index): pareil que SI (instruction STOS) • BP (base pointeur): sert de pointeur sur la base de la pile, et permet d’atteindre n’importe quel élément de la pile (exemple: MOV AX,[BP+2]). • SP (Stack pointer): pointe sur le sommet de la pile; son contenu est automatiquement changé par les instructions PUSH et POP. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 31 Assembleur 8086 Liste des registres les plus utilisés B. Registres spéciaux • IP (Instruction pointeur): contient l’adresse de l’instruction qui suit celle qui est en cours d’exécution. • DS (Data Segment): Pointe sur le début du segment qui contient les données • CS (Code Segment): Pointe sur le segment qui contient le code du programme. • ES (Extended Segment) : permet de pointer sur un segment supplémentaire défini par le programmeur. Il se charge par l’intermédiaire de AX, comme pour DS. • SS (Stack Segment): segment contenant la pile. C. Registre indicateur : utilisé pour sauvegarder des états particuliers du microprocesseur en référence à la dernière instruction exécutée. Quelques bits seulement de ce registre ont une signification sont nommés: CF (retenue), OF (débordement), etc. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 32 Assembleur 8086 Les Indicateurs d’état Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 33 Assembleur 8086 Format standard d’une instruction Label: Mnémonique Opérandes ;commentaire Label: Est un identificateur permettant de désigner un endroit dans le code source, soit une instruction, soit une donnée. Si le label est placé avant une instruction, on fait référence à l’adresse de cette instruction. Si c’est avant une donnée, on fait référence à l’adresse de cette instruction. Le label de code doit se terminer par deux points (:). Il sert général comme destinations des instructions ou des retour de début des boucles de répétition. Le label de donnée ne contient pas les deux points(:) à la fin. Il sert dans ce cas là comme identificateur. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 34 Assembleur 8086 Liste des registres les plus utilisés • Mnémonique (des instructions): il sert à identifier une instruction donnée. Quelques instructions de base sont résumées dans la prochaine section. • Opérandes: une instruction assembleur peut avoir de 0 à 3 opérandes. Chaque opérande peut être le nom d’un registre, un opérande mémoire, une expression constante ou le nom d’un périphérique entrée/sortie. • Commentaire: précédé du point-virgule (;). Il sert à à ajouter des informations explicatives au sujet du fonctionnement du programme ou de l’instruction correspondante. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 35 Assembleur 8086 Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 36 Assembleur 8086 JZ Saut si zéro. JE Saut si égal. JC Saut si Retenue (inférieur). JNC JB Saut si inférieur. JNB JNAE Saut si ni supérieur ni égal. CF = 1 JAE JS Saut si signe négatif. SF = 1 JNS JO Saut si débordement. OF = 1 JNO JPE Saut si parité paire. JP Saut si parité. PF = 1 JPO JNZ Saut si pas zéro. JNE Saut si différent. JNC Saut si pas de retenue. JC JNB Saut si pas inférieur. JB JAE Saut si supérieur ou égal. CF = 0 JNAE JNS Saut si aucun signe (positif). SF = 0 JS JNO Saut si pas de débordement. OF = 0 JO JPO Saut si parité impaire. JNP Saut si pas de parité. Lotfi BOUSSAID JNZ ZF = 1 JNE JZ ZF = 0 JE JPE PF = 0 JP Microprocesseurs & Microcontrôleurs 37 Assembleur 8086 Instruction CMP (Comparer) CMP destination, source Compare Opérandes CF ZF Dest. > Src. 0 0 Dest. = Src. 0 1 Dest. < Src. 1 0 L’instruction CMP affecte les indicateurs AF, OF, SF, PF, CF et ZF mais seuls CF et ZF sont utilisés. L’opérande destination peut être dans un registre ou dans une mémoire. L’opérande source peut être dans un registre, dans une mémoire, ou en mode immédiat. Les opérandes (destination et source) ne changent pas. DATA1 … PASSE: TEMP … PROCHAIN: DW 235FH MOV MOV CMP JNC ADD ADD BX, 7888H CX, 9FFFH BX, CX PASSE BX, 4000H CX, DATA1 DB ? MOV CMP JZ INC HLT AL, TEMP AL, 99 PROCHAIN BX ; 7888Hh BX ; BX < CX CF=1 JNC est exécutée PASSE ; Note: les contenus de (BX, et CX) ne changent pas après CMP ; mais CF est toujours vérifié pour (< ou >). Pour (=) on utilise ZF. ; TEMP AL ; TEMP = 99?. Avec (SUB AL, 99), la même chose mais 0 AL ; Si ZF=1 (TEMP=99), Saute a PROCHAIN: ; Sinon incrémente BX ; Arrêt du programme Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 38 Assembleur 8086 TITLE prog1.asm: Exemple sur CMP, Trouver l’octet le plus grand parmi 5 notes d’élèves PILE segment stack dw 100 dup(?) PILE ends ;------------------------------------------------------------------------------------------------------------------------------------------------------------DATA segment NOTES DB 18, 06, 19, 11, 08 PLUS_G DB ? DATA ends ;-----------------------------------------------------------------------------------------------------------------------------------------------------------CODE segment main: assume CS:CODE, DS:data ; génération de l’adresse du segment de code et de données MOV AX, DATA ; Initialiser le registre DS pour récupérer l’adresse du segment de donnée MOV DS, AX MOV CX, 5 ; compteur de boucle MOV BX, OFFSET NOTES ; BX pointe vers les données NOTES XOR AL, AL ; Initialise AL à 0; va héberger la plus grande note ENCORE: CMP AL, [BX] ; compare la note prochaine a la note la plus élevée JA PROCHAIN ; Sauter si AL est encore la note la plus élevée MOV AL, [BX] ; sinon AL retient la plus élevée PROCHAIN: INC BX ; pointe vers la prochaine note LOOP ENCORE ; CX décrémente jusqu’à 0 pour sortir de la LOOP MOV PLUS_G, AL ; sauvegarde de la note la plus élevée dans PLUS_G ;------------------------------------------------------------------------------------------------------------------------------------------------------------MOV AH, 4Ch INT 21h CODE ENDS END MAIN Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 39 Assembleur 8086 TITLE prog2.asm: Exemple sur ROL, Trouver le nombre de ‘1’ dans un mot Pile segment stack ; déclaration d’un segment de pile – pas nécessaire dans notre cas dw 100 dup(?) Pile ends ;-----------------------------------------------------------------------------------------------------------------------------------------------------------DATA segment DATA1 DW 5F97H COMPTE DB ? DATA ends ;------------------------------------------------------------------------------------------------------------------------------------------------------------CODE segment MAIN: ASSUME CS:CODE, DS:DATA MOV AX,DATA MOV DS, AX XOR BL, BL ; Mettre BL à 0 (ou bien SUB) MOV DL, 16 ; rotation 16 fois MOV AX, DATA1 ENCORE: ROL AX, 1 ; Rotation a gauche (a droite aussi si on préfère) JNC PROCHAIN ; Test si CF=0 INC BL ; Si CF = 1, incrémenter le compteur du nombre de ‘1’ PROCHAIN: DEC DL ; répéter 16 fois JNZ ENCORE ; encore une fois si ce n’est pas fini MOV COMPTE, BL ; sauvegarder le résultat dans la case mémoire COMPTE ;-----------------------------------------------------------------------------------------------------------------------------------------------------------MOV AH, 4Ch INT 21h CODE ENDS END MAIN Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 40 Assembleur 8086 Un mot sur les macros Étant donné que certaines instructions se répètent constamment dans un programme, l’écriture de macro-fonctions (ou macros) est un moyen pratique de rendre votre code source plus lisible. Il est possible de choisir pour certaines suites d’instructions un nom qui les représente. Lorsque l’assembleur rencontrera ce nom dans votre code source, il le remplacera par les lignes de code qu’il désigne. Ces lignes forment une « macro ». Les macros, à la différence des procédures, n’ont aucune signification pour la machine. Seul l’assembleur comprend leur signification. Elles ne sont qu’un artifice mis à la disposition du programmeur pour clarifier son programme. Lorsque l’assembleur rencontre le nom d’une macro dans votre code, il le remplace par le code de la macro. Tout se passe exactement comme si vous aviez tapé vous-même ce code à la place du nom de la macro. Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 41 Assembleur 8086 Exemple de Macro affiche macro chaine push dx mov dx,offset chaine mov ah, 09h int 21h pop dx endm ; nom macro paramètres ; sauvegarder le contenu de DX, par ; exemple, en utilisant la pile ; sauvegarde de dx dans la pile ; restauration de dx ;fin de la macro Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 42 Assembleur 8086 TITLE ex3_somme PILE SEGMENT STACK ; somme de deux nombres ; déclaration de pile. ; Pour cet exemple, la pile n’est pas nécessaire. DW 100 DUP (?) PILE ENDS affiche macro chaine MOV DX,offset chaine MOV AH, 09h INT 21h ENDM ; macro pour afficher une chaîne de caractères ; offset renvoie l’adresse de début de chaine ; fonction qui affiche une chaîne de caractères ; fin de la macro DATA SEGMENT ; déclaration de variables val1 db 0 val2 db 0 recup_val1 db 10,13,'veuillez taper la valeur1',10,13,'$' ; 10 et 13=endl du C++ recup_val2 db 10,13,'veuillez taper la valeur2',10,13,'$‘ aff_resu db 10,13,'la valeur saisie est:',32,'$' ; $ caractère de fin de chaine DATA ENDS Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 43 Assembleur 8086 SCODE SEGMENT ASSUME CS:SCODE, DS:DATA DEBUT: MOV AX, DATA MOV DS, AX ; zone de code ; génération de l’adresse du segment de code et de données ; entrée du code ; Initialiser le registre DS pour récupérer l’adresse du ; segment de donnée ; à partir d’ici on peut placer nos lignes de code affiche recup_val1 ; appel de macro pour afficher un message contenu dans ;recup_val1 ; faire une lecture au clavier grâce à la fonction 1 le ;caractère tapé sera placé dans AL MOV AH,1 INT 21h MOV val1,AL affiche recup_val2 MOV AH,1 INT 21h ADD AL,val1 MOV val2,AL ; appel de la macro pour afficher un message sur écran ;faire une lecture au clavier ; AL = AL + val1 Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 44 Assembleur 8086 affiche aff_resu SUB val2,30h ; appel de la macro pour afficher un message sur écran ; les valeurs lues tantôt sont en ascii; exemple : ; si on tape les valeurs 1 et 2, ; le programme récupère 31 et 32, valeurs ; hexadécimales des caractères 1 et 2. ; Donc 31 + 32 = 63. et 63 n’est pas la valeur hexa ; du caractère 3. Sa valeur est 33 ; autrement dit, on doit retirer 30 en hexa ou 48 en ; décimal. ; afficher la valeur saisie grâce à la fonction 2 ; qui affiche le contenu de DL MOV AH,2 INT 21h MOV DL,val2 MOV AH, 4Ch MOV AL, 0 INT 21h CODE ENDS END DEBUT ; on termine le programme avec la fonction ; 4c en hexa. On place une valeur >=0 pour dire ; que l’exécution s’est déroulée correctement. ; Équivalent en c de return 0 ; fin du segment de code Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 45 Assembleur 8086 Expression arithmétique : X = (A*2 + B*C)/(D-3) ....... Data segment X dw ? A dw ? B dw ? C dw ? D dw ? Data ends Arithmetique proc near MOV AX, 2 IMUL A MOV BX,DX MOV CX,AX MOV AX,B IMUL C ADD AX,CX ADC DX,BX MOV CX, D SUB CX,3 IDIV CX MOV X,AX RET Arithmetique endp ............ ;établir la constante ;DX:AX = A*2 ; ;BX:AX = A *2 ;DX:AX = B*C ;AX = AX + CX ! faites attention, il peut y avoir une retenue ici ;DX:AX = A*2+B*C + la retenue s’il y a lieu avec ADC ; cx = D -3 ; AX =(A*2 + B*C)/(D-3) ; X = ax (A*2 +B*C)/(D-3) stocker le résultat ; fin de la procedure Lotfi BOUSSAID Microprocesseurs & Microcontrôleurs 46