DÉCLARATION DES DONNÉES & MODES D ADRESSAGES Par : Khaled.hassine@fsg.rnu.tn 23/08/2010 1 30/01/2016 2 30/01/2016 3 30/01/2016 4 1
30/01/2016 5 30/01/2016 6 Syntaxe : <Identificateur de Constante> EQU <Value> <Identificateur de Constante> = <Value> L assembleur parcoure le code source et change chaque occurrence de la constante par sa valeur Exemple : A EQU 126 B = 1FH C EQU 101B D = 'Hello' 23/08/2010 7 30/01/2016 8 2
Directives de déclaration des variables Déclaration des variables Directiv e Signification DB Define Byte 1 octet DW Define Word 2 octets DD DQ Define Double Word Define Quad WordDirectiv e Réserver en mémoire 4 octets 8 octets Signification Interprétation de la valeur D Decimal décimal (par défaut) B Binary en binaire O Octal en octal H Hexadécimal en hexadécimal 23/08/2010 9 <Identificateur> <Type Elément> [[<Taille > DUP] [<Valeur initiale> [D/B/O/H]]/?/"<Caractères >"] <Identificateur> de la variable <Type Elément> : DB, DW, DD, DQ <Taille> : Taille de la structure répétitive (entier) DUP : directive de structures répétitives (DUPlicate) <Valeur initiale> la valeur initiale de chaque variable ' ' : caractères ou chaine de caractères (codés en ASCII),? : initialisée à 0 (zéro par défaut 0), Si plusieurs valeurs initiales séparées par des virgules, réservation d'une suite d'emplacements, à chacun est affectée une valeur 23/08/2010 10 DB : Exemple Déclaration Mémoire Adresse Contenu A DB 126 0 7EH B DB 1FH 1 1FH C DB 101B 2 05H Ch DB 'LA' 3 4CH 41H Tab DB 9,1AH,-1,'B',? 5 09H 1AH FFH 42H 00H 23/08/2010 11 DW et vecteurs : exemple Déclaration Mémoire Adresse Contenu Gamma DW? 0 00H 1 00H Beta DW 1234H 2 34H 3 12H V1 DB 2 DUP (5) 4 05H 5 05H V2 DW 2 DUP (0AFFH) 6 FFH 7 0AH 8 FFH 9 0AH 23/08/2010 12 3
Le 8086 : Architecture interne AX BX CX DX Source index Destination index Base pointer Stack pointer Registres généraux EXECUTION UNIT (EU) 15 7 0 AH AL BH BL CH CL DH DL SI DI BP SP Accumulateur Base Compteur Données (E/S) BUS MULTIPLIXE BUS INTERFACE UNIT (BIU) Registres de Segment 15 0 CS DS SS ES IP GENERATION D ADRESSES & BUS DE CONTROLE OPERANDES Flags Registrs Registres d'état et de contrôle ALU SEQUENCEUR CHAINE D INSTRUCTIONS Buffer 30/01/2016 13 23/08/2010 14 Principaux registres du Pentium Classification des registres du 8086 23/08/2010 15 23/08/2010 16 4
Adressage des registres Adressage immédiat Les deux opérandes sont des registres : from register to register N est pas vraiment un mode d adressage puisqu il n accède pas à la mémoire Mode d adressage très rapide : seul le bus interne est utilisé L'opération se fait sur un ou 2 registres Exemples : INC AX ; incrémenter le registre AX MOV AX, BX ; Copier le contenu de BX dans AX Pas d accès à la mémoire : n est pas vraiment un mode d adressage très rapide : seul le bus interne est utilisé Le deuxième opérande est directement codé dans l instruction Inconvénient : valeur figée dans l'instruction => la modifier oblige à modifier le programme. Exemple : MOV AH, 30H 23/08/2010 17 23/08/2010 18 La segmentation : synoptique Les registres segments et associations CS : Code Segment Segment de code, Stocke les instructions DS : Data Segment Segment de données, Réservation de la mémoire pour les variables ES : Extra Segment Utilisation spécifique, sur demande uniquement Souvent utilisé avec DI SS : Stack Segment Segment de pile UAL de calcul d adresse 23/08/2010 19 Chaque registre segment est associé à un ou plusieurs registres d offset afin de former une adresse physique réelle : Registre segment Registres associés CS IP SS SP et/ou BP DS BX et/ou SI et/ou DI ES Une adresse logique est exprimée en hexadécimal sous la forme SSSS:OOOOoù SSSS est le segment et OOOO est l offset. La valeur de l adresse physique sur 20 bits est : SSSS0H+OOOOH = SSSS*16+OOOO. Exemple : pour les instructions, CS:IP est utilisé. CS = 1111H IP = AAAAH. L adresse de l instruction pointée par IP est 11110H+ 0AAAAH = 1BBBAH. Pour les instructions affectant la pile (PUSH, POP, CALL, RET, etc.), SS:SP est utilisé. DS:SI et ES:DI sont habituellement utilisés pour travailler sur des tableaux ou des chaînes de caractères. 23/08/2010 20 5
Adressage direct Adressage direct Le plus simple et rapide des modes d adressage L opérande est désigné par l adresse donnée dans l instruction L'adresse réelle est calculée comme suit (registre de segment par défaut DS) : Forme générale Exemple <Opération> <Identificateur DS*10H+@<Identificateur variable> de la variable> DIV M <Opération> <Identificateur variable>, <Registre> <Opération> <Registre>, <Identificateur variable> MOV M, AX MOV AX, M <Opération> <Identificateur variable>, <Constante> MOV M, 1 On peut spécifier (forcer) le registre de segment : Exemple : MOV ES:M, AX On peut spécifier directement l adresse de la variable: Exemple : MOV ES :[0C040H], AL MOV [0C040H], AL 23/08/2010 21 23/08/2010 22 Adressage indirect par registre Adressage indexé L opérande est désignée par une adresse placée dans le registre d adresse donnée dans l instruction BX, BP, SI, DI peuvent servir de registre d adresse (de pointeur) Le registre doit être entre [ ]. Si BP est utilisé, le registre de segment par défaut est SS. Pour les autres registres, DS est le registre de segment par défaut Exemples : MOV AX, [BX] ; AX le contenu de l'adresse DS:BX MOV AX, [BP] ; AX le contenu de l'adresse SS:BP MOV AX, [SI] : AX le contenu de l'adresse DS:SI MOV AX, [DI] : AX le contenu de l'adresse DS:DI MOV AX, [ES:BP] : AX le contenu de l'adresse ES:BP Intérêt : Parcourir les structures itératives En langage évolué, une référence à un élément de tableau s'écrit : TAB(i) Dans l'instruction assembleur correspondante elle s'écrit : TAB[registre d'index] En ASM, le programmeur gère le registre d'index Pour accéder au i ème élément du tableau, on doit réaliser : Registre d'index (i - 1)*n où n = nb d'octets occupés par un élément On utilise l un des registres d Index : SI ou DI L'adresse réelle est calculée comme suit (registre de segment par défaut DS) : DS*10H + @<Vecteur> + <SI/DI>x <Taille d un élément> Exemple : TAB DB 1, 10, 30H MOV SI, 1 ADD AH, TAB[SI] ; AH AH+TAB[SI] 23/08/2010 23 23/08/2010 24 6
Adressage indexé avec déplacement Adressage basé (relatif) On peut préciser un déplacement qui sera ajouté au contenu de Ri pour déterminer l offset, INST Reg., [<Reg. Seg.> : <Reg ind.> + dep] INST [<Reg. Seg.> : <Reg ind.> +dep], Reg. INST taille [<Reg. Seg.> : <Reg ind.> +dep], Cste Exemples : MOV AX, [SI] ; AX le contenu de l'adresse DS:SI MOV AX, [SI+50] ; AX le contenu de l'adresse DS:SI+50 MOV AX, [DI-8] ; AX le contenu de l'adresse DS:DI-8 MOV AX, [ES:SI+4] ; AX le contenu de l'adresse ES:SI+4 Intérêt : manipulation des structures. L offset se trouve dans l un des deux registres de base BX ou BP, auxquels est ajouté un déplacement INST <Reg>, [<Reg. Seg.> :<Reg. Base>+dep] INST [<Reg. Seg.>:<Reg. Base>+dep], <Reg> INST taille [<Reg. Seg.> :<Reg. Base>+dep], im Exemples : MOV AX, [BX+5] ; AX le contenu de l'adresse DS:BX+5 MOV AX, [BP-200] ; AX le contenu de l'adresse SS:BP-200 23/08/2010 25 23/08/2010 26 Adressage Basé indexé L adresse de l'opérande est la somme d'un registre de base, d'un registre d'index et éventuellement d'un déplacement. Les couples des registres de base et d index possibles sont : BP-DI BP-SI BX-DI BX-SI Si le registre segment n'est pas spécifié, le segment par défaut du registre de base est utilisé : INST Reg., [<Reg. Seg.> : <Reg. Base>+<Reg ind.> +dep] INST [<Reg. Seg.> : <Reg. Base>+<Reg ind.> +dep], R INST <taille> [<Reg. Seg.> : <Reg. Base>+<Reg ind.> +dep], Cste Exemples : MOV AX,[BX+SI] ; AX le contenu de l'adresse DS:BX+SI MOV AX,[BX+DI+5] ; AX le contenu de l'adresse DS:BX+DI+5 MOV AX,[BP+SI-8] ; AX le contenu de l'adresse SS:BP+SI-8 MOV AX,[BP+DI] ; AX le contenu de l'adresse SS:BP+DI 23/08/2010 27 23/08/2010 28 7