Assembleur Djamal Rebaïne 2 Niveaux de programmation • Niveaux de programmation
Assembleur Djamal Rebaïne 2 Niveaux de programmation • Niveaux de programmation circuit logiques 0/1 --------------------------------------------------------------------------------- unité de traitement micro-instructions (UAL, chemins de données) = suite de 0/1 (Unité de commande) micro-pgme = suite de micro-instructions ------------------------------------------------------------------------------------ Codop 111111 000011101010101 langage machine = suite de 0/1 ------------------------------------------------------------------------------------ ADD A,20 assembleur = remplacer les codop JZ 13 par des mnémoniques Djamal Rebaïne 3 Structure d’un programme assembleur 8086 TITLE nom ; donner un nom au programme PILE SEGMENT STACK ; déclaration d’un segment de pile ; dont le nom est pile .......... .......... PILE ENDS ; fin de la déclaration de la pile DONNEE SEGMENT ; déclaration d’un segment de données qui va ; contenir les variables ........... DONNEE ENDS ; fin de la déclaration de données LECODE SEGMENT ; déclaration du segment de code qui va contenir ; le code Debut: ; étiquette d’indication du point d’entrée du code ................................. LECODE ENDS ; fin de la déclaration du code END Debut ; fin du point d’entrée du code Exemple Djamal Rebaïne 4 TITLE prog2.asm: Exemple sur ROL, ; pour mettre un commentaire, on écrit ; Pile segment stack ; segemnt de pile dw 100 dup(?) Pile ends DATA segment ; segement de donnée DATA1 DW 5F97H COMPTE DB ? DATA ends CODE segment ; segment de code 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 MAIN ENDS END MAIN Pourquoi les segments? À l'origine - Pour pouvoir adresser plus de 64 Ko de mémoire dans un programme car les registres sont sur 16 bits En pratique aujourd'hui - Permet de séparer clairement des zones mémoires selon leur rôle Exemple : la pile ne peut pas être écrasée par des données ou déborder sur des données / code Mais cela est contraignant ... Djamal Rebaïne 5 Suite Adressage sur 20 bits avec 2 registres 2 registres 16 bits : peut coder adresses sur 32 bits Pour uniquement 20 bits (car les bus d’adresse sur les processeurs 8086 sont sur 20 bits): - Décale le premier registre de 4 bits et l'additionne au second - Adresse notée A:B - Adresse réelle : A * 16 + B Exemple (les nombres sont en hexa) • 3100:27EE correspond à l'adresse 31000 + 27EE = 337EE • Décaler de 4 bits en binaire revient à décaler d'un chiffre en hexa Djamal Rebaïne 6 Suite 2 Nous avons 4 segments d'adresses : CS, DS, SS, ES • utiliser 2 registres pour adresser des mots mémoires - Le premier est le registre de segment - Le second un registre général On l'appelle l'offset (décalage) Addresse : segment:offset • Exemples - CS:IP : adresse de la prochaine instruction à exécuter - DS:SI : adresse d'une donnée - SS:SP : adresse du haut de la pile Djamal Rebaïne 7 Djamal Rebaïne 8 • Vos programme sources, écrits en assembleur, doivent avoir l’extension .asm pour ASseMbler Djamal Rebaïne 9 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) non initialisé 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 chacun à 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 Djamal Rebaïne 10 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 caratè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 ; donne la main au DOS • Saisie d’un caratère: mov AH, 1; fonction no. 1 (avec écho) int 21h ; résultat est mis dans AL Djamal Rebaïne 11 • Saisie d’un caractère mov AH, 7; fonction no. 7 (sans écho) int 21h ; 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 Djamal Rebaïne 12 L’équivalent de quelques instructions du langage C en assembleur • if then else Assembleur If ax =1 if: CMP AX, 1 bx = 10; JNZ Else else { bx = 0; Then: MOV BX,10 cx = 10; JMP endif } Else: MOV BX,0 MOV CX,10 endif: .............. Djamal Rebaïne 13 … Instruction i Si condition alors Instructions j Sinon Instruction m Fin si Instructions k Instruction i Condition ? Instructions j Instructions k VRAI FAUX Instructions m Djamal Rebaïne 14 • La boucle FOR Assembleur • For (k=0; k<=10; k++) MOV BX,0 • bx = bx + k; MOV CX,0 For: CMP CX,10 JA Endfor ADD BX,CX INC CX JMP For Endfor: Djamal Rebaïne 15 • WHILE Assembleur • bx = 5 MOV BX,5 • while (bx >0) while: CMP BX,0 bx = bx -1; JLE Endwhile DEC BX JMP while Endwhile: En règle générale • while (a > b) while: cmp a,b • { jle endwhile … … } jmp while … endwhile: … Djamal Rebaïne 16 Djamal Rebaïne 17 • SWITCH Assembleur • switch (n) { CMP n,1 case 1: ....; break; JNE case2 case 2: .....; break; ............ default: .....; JMP endswitch } case2: CMP n,2 JNE default .......... JMP endswitch default: ........... endswitch: ........... Djamal Rebaïne 18 Écrire le code de l’instruction En assembleur if (a>b) && (c <= d) if: cmp a, b { jng endif ................ } cmp c, d jnle endif .............. endif: Exercice: coder en assembleur les instructions suivantes: 1. if (a >b) || (c > d)) 2. for (i=1; i < 10; i++) { { } } Djamal Rebaïne 19 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. Djamal Rebaïne 20 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. Djamal Rebaïne 21 La plupart des opérations de calculs donnent des informations sur le résultat dans le registre spécial flags. Les informations possibles sont : CF : 1 si le résultat a donné lieu à une retenue PF : 1 si l'octet de poids faible du résultat à un nombre pair de 1 AF : 1 si le résultat a donné lieu à une retenue sur le 3eme bit ZF : 1 si le résultat est zéro SF : 1 si le résultat est négatif uploads/S4/ presenatationassembleur-2010.pdf
Documents similaires










-
36
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Aoû 23, 2021
- Catégorie Law / Droit
- Langue French
- Taille du fichier 0.4788MB