Documente Academic
Documente Profesional
Documente Cultură
Contenu du cours
Dfinition Adressage simple Note sur le stockage en mmoire Adressage complexe Note sur les segments
Dfinition
Les oprandes dune instruction peuvent tre exprimes de plusieurs faons : Directe (valeur immdiate) Indirecte (valeur dans une case mmoire) Registre (valeur dans un registre) Base (valeur indirecte via registre) Indexe (Base + Registre {+ Echelle}) Base/Indexe + dcalage
Contenu du cours
Dfinition Adressage simple Note sur le stockage en mmoire Adressage complexe Note sur les segments
Valeur indirecte Valeur stocke dans une case mmoire fixe v = Mem(adresse) Exemples : movl (1),%eax # eax Mem(DS:1..4) movw prix,%bx # bx Mem(DS:prix..prix+1)
Utilisation
Valeur immdiate Insertion de valeur dans un programme Valeur indirecte Accs une variable globale Accs une constante Registre Variable intermdiaire Stockage temporaire Rsultat de fonction (EAX) Gestion de la pile (EBP/ESP)
Contenu du cours
Dfinition Adressage simple Note sur le stockage en mmoire Adressage complexe Note sur les segments
Contenu du cours
Dfinition Adressage simple Note sur le stockage en mmoire Adressage complexe Note sur les segments
Autre utilisation : les structures Variable compose de plusieurs valeurs Point = struct { short x,y; Couleur c } @Point.x = @Point, @Point.y = @Point+2, @Point.c = @Point+4
Point p; p.y =0 movl $p,%ebx movw $0, 2(%ebx)
Adressage index+dplacement
Les tableaux de structures Exemple : afficher des noms/prnoms struct etudiant {char* nom, prenom; int note}; Promo: .long N1,P1,18, N2,P2,15, N3,P3,8 \ ,N4,P4,12, N5,P5,3, 0 format: .string "tudiant %s (%s)\n" movl $Promo,%ebx movl $0,%esi Boucle: pushl 4(%ebx,%esi) # empile prnom pushl 0(%ebx,%esi) # empile nom pushl $format # empile @ de tudiant %s (%s)\n call printf addl $12,%esp # nettoie la pile (retirer 3 @ 32 bits) addl $12,%esi # passe au suivant (+12 octets) cmpb $0,(%ebx,%esi) # compare nom 0 jne Boucle # si boucler
T: .double 1.414,2,3.14,4,5,6.55957,7,8,9,10 Fmt: .string "valeur %f\n" movl $T,%ebx movl $9,%esi Boucle: fldl (%ebx,%esi,8) # charge la valeur fstpl 4(%esp) # stocke la valeur sur la pile movl $Fmt,(%esp) # stocke le format sur la pile %f\n call printf dec %esi # passe la valeur suivante jns Boucle # si 0, alors boucler Fin:
.data C1: .ascii "abcdefghi" C2: .string "%c\n" .text .macro affiche movzbl %al,%edx pushl %edx pushl $C2 call printf addl $8,%esp .endm .global start start : pushl %ebp movl %esp,%ebp
movl $C1,%ebx movb (%ebx),%al affiche a movl $3,%ecx movb (%ebx,%ecx),%al affiche d movl $3,%ecx movb (%ebx,%ecx,2),%al affiche g
Contenu du cours
Dfinition Adressage simple Note sur le stockage en mmoire Adressage complexe Note sur les segments
Les segments
On utilise principalement 4 registres de segments : CS, DS, ES, SS Par dfaut : Toute instruction est lue dans CS Tout accs indirect se fait dans DS Tout accs bas sur e?x se fait dans DS Tout accs bas sur e?p se fait dans SS Toute fonction de chane se fait dans ES On peut imposer le segment de son choix sauf Instructions TOUJOURS dans CS Chanes TOUJOURS dans ES
Dfinition Adressage simple Note sur le stockage en mmoire Adressage complexe Note sur les segments Exercices
Exercice 1
movl movw movw movb movb imul movw \ $0x12345678,%eax %ax,%bx %bx,%cx %bh,%al %ah,%bh $0x10000,%ecx %ax,%cx
EAX=0x12345678 EBX=0x????5678 ECX=0x????5678 EAX=0x12345656 EBX=0x????5678 ECX=0x56780000 ECX=0x56785656
Exercice 2
a: .long 1 b: .short -1 movw a,%bx movl a,%ecx movl %ecx,%edx movw b,%dx movw %dx,2(a) movl 2(a),%edx
a:01000000 b:FFFF EBX=0x????0001 ECX=0x00000001=1 EDX=0x00000001=1 EDX=0x0000FFFF a:0100FFFF ab:0100FFFFFFFF EDX=0xFFFFFFFF=-1 ab=0x0100FFFFFFFF ->0x0100FF0100FF a=0x01FF0001 b=0xFF00
Exercice 3
.set prix=0 .set qte=2 Inv: .short 1,10 .short 3,5 .short 18,10 Somme: movl $2,%ecx movl $Inv,%ebx movl $0,%edx Somme1: movw prix(%ebx,%ecx,4),%ax imulw qte(%ebx,%ecx,4) ,%ax addl %eax,%edx decl %ecx jns Somme1 #edx = ?
ECX=2 EBX=Inv EDX=0 Somme1.1: AXMem[Inv+2*4+0]=18 AX*=Mem[Inv+2*4+2]=1 0 EDX+=EAX (EDX180) ECX-- (ECX1) Somme1.2: AXMem[Inv+1*4+0]=3 AX*=Mem[Inv+1*4+2]=5 EDX+=EAX (EDX195) ECX-- (ECX0) EFLAGS.Z 1
Exercice 3 (2)
.set prix=0 .set qte=2 Inv: .short 1,10 .short 3,5 .short 18,10 Somme: movl $2,%ecx movl $Inv,%ebx movl $0,%edx Somme1: movw prix(%ebx,%ecx,4),%ax imulw qte(%ebx,%ecx,4) ,%ax addl %eax,%edx decl %ecx jns Somme1 #edx = ?
EDX=195, ECX=0, EBX=Inv EFLAGS.Z=1 Somme1.3: AXMem[Inv+0*4+0]=1 AX*=Mem[Inv+0*4+2]=10 EDX+=EAX (EDX205) ECX-- (ECX-1) EFLAGS.Z 0 EFLAGS.S 1 JNS ne saute pas (S=1) EDX=205 EDX=prix1*qte1 +prix2*qte2 +prix3*qte3