Intro 1/73 Registres Instructions Structures de contrôle Tableaux Sous programmes Le langage assembleur intel 64 bits c Sovanna Tan Novembre 2013 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Plan 2/73 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Sources Introduction to 64 Bit Intel Assembly Language Programming for Linux, Ray Seyfarth, CreateSpace Independent Publishing Platform, 2nd edition , 2012. La documentation Yasm, http://yasm.tortall.net/Guide.html. Le langage assembleur, Maı̂trisez le code des processeurs de la famille X86, Olivier Cauet, Editions ENI, 2011. Introduction à la programmation en assembleur 64 bits, Pierre Jourlin, http://www.jourlin.com, 2010. Langage Assembleur PC (32 bits) , Paul A. Carter traduction Sébastien Le Ray, 2005, http://www.drpaulcarter.com/pcasm. Initiation à l’assembleur, Pierre Marchand, 2000, http://www.ift. ulaval.ca/~marchand/ift17583/Supplement2.pdf. Linux, Assembly Language Programming, Bob Neveln, Prentice Hall , 2000. 3/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Le microprocesseur Microprocesseur Circuit électronique complexe : cœur de l’ordinateur Identifie et exécute les instructions Instruction Code opérateur ou opcode : action à effectuer Opérande(s) Registre Petite zone de mémoire d’accès très rapide située dans le microprocesseur 4/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Architecture simplifiée d’un processeur Image provenant de : http://www.lions-wing.net/lessons/hardware/hard.html#cpu 5/73 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Le langage assembleur Langage de bas niveau Chaque instruction se traduit directement en une instruction binaire pour le processeur. Il existe différents dialects : Yasm, the modular assembler : utilisé dans ce cours, en TD et en TP, issu de Netwide asm (nasm) : utilisé les années précédentes Gas : assembleur GNU utilisé avec gcc Macro asm : assembleur Microsoft Turbo asm : assembleur Borland 6/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Premier programme en assembleur (1) ; f o n c t i o n s e x t e r n e s pour l e s e n t r e e s / s o r t i e ; a p p e l p r i n t f (”% s ” , prompt1 ) extern p r i n t f mov r d i , s t r i n g F o r m a t extern scanf mov r s i , prompt1 segment . d a t a ; memoire g l o b a l e mov r a x , 0 ; donnees i n i t i a l i s e e s call printf prompt1 db ” E n t r e z un e n t i e r : ” , 0 ; a p p e l s c a n f (”% l d ” , e n t i e r 1 ) mov r d i , l o n g I n t F o r m a t prompt2 db ” E n t r e z un d e u x i e m e e n t i e r : ” , 0 f o r m a t S o r t i e db ” La somme d e s e ux e n t i e r s : %l d ” , 1 0 , 0 mov r s i , e n t i e r 1 mov r a x , 0 s t r i n g F o r m a t db ”%s ” , 0 l o n g I n t F o r m a t db ”%l d ” , 0 c a l l scanf mov rbx , [ e n t i e r 1 ] newLine db 1 0 , 0 ; a p p e l p r i n t f (”% s ” , prompt2 ) mov r d i , s t r i n g F o r m a t segment . b s s ; memoire g l o b a l e mov r s i , prompt2 ; d o n n e e s non i t i a l i s e e s entier1 resq 1 mov r a x , 0 ; r a x c o n t i e n t l e nombre de ; p a r a m e t r e s de t y p e d o u b l e d a n s l ’ a p p e l de entier2 resq 1 r e s u l t a t resq 1 ; printf call printf ; a p p e l s c a n f (”% l d ” , e n t i e r 2 ) segment . t e x t ; c o d e du programme mov r d i , l o n g I n t F o r m a t global asm main ; f o n c t i o n a p p e l e e p a r l e programme C mov r s i , e n t i e r 2 asm main : mov r a x , 0 ; r a x c o n t i e n t l e nombre de ; sauvegarde des r e g i s t r e s sur l a p i l e push r b p ; p a r a m e t r e s de t y p e d o u b l e d a n s l ’ a p p e l de ; scanf c a l l scanf mov r c x , [ e n t i e r 2 ] ; c a l c u l de l a somme e t s a u v e g a r d e du r e s u l t a t add rbx , r c x mov [ r e s u l t a t ] , r b x 7/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Premier programme en assembleur et code C qui appelle le programme ; appel p r i n t f ( f o r m a t S o r t i e ,∗ r e s u l t a t ) mov r d i , f o r m a t S o r t i e mov r s i , [ r e s u l t a t ] mov r a x , 0 call printf ; r e s t a u r a t i o n des r e g i s t r e s pop r b p ; e n v o i de 0 au programme C mov rax , 0 ret 8/73 e x t e r n u n s i g n e d l o n g i n t asm main ( ) ; i n t main ( ) { unsigned long i n t r e t s t a t u s ; r e t s t a t u s=asm main ( ) ; return r e t s t a t us ; } Commandes de compilation gcc yasm gcc -c -g -std=c99 -m64 driver.c -g dwarf2 -f elf64 first.asm -m64 -g -std=c99 -o first driver.o first.o Exécution du programme ./first Entrez un entier : 7 Entrez un deuxieme entier : 34 La somme des eux entiers : 41 c Sovanna Tan Assembleur intel Intro 9/73 Registres Instructions Structures de contrôle 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Tableaux Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les principaux registres 64 bits 10/73 rax rbx rcx rdx rsi rdi rsp rbp r8 r9 .. . r15 rip registre registre registre registre registre registre registre registre registre registre général, général général, général, général, général, général, général, général général accumulateur, contient la valeur de retour des fonctions compteur de boucle partie haute d’une valeur 128 bits adresse source pour déplacement ou comparaison adresse destination pour déplacement ou comparaison pointeur de pile (stack pointer) pointeur de base (base pointer) registre général compteur de programme (instruction pointer) c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Accès à une partie du registre 11/73 Certaines parties des registres sont accessibles à partir des identifiants suivants : rax , rbx , rcx , rdx, rdi , rsi , rbp, rsp , r8 , r9 , ... ,r15 eax, ebx, ecx, edx, edi , esi , ebp, esp, r8d, r9d, ... ,r15d ax, bx, cx, dx, di , si , bp, sp, r8w, r9w, ... ,r15w ah, bh, ch, dh al , bl , cl , dl , dil , sil , bpl , spl ,r8b, r9b, ... ,r15b c Sovanna Tan Assembleur intel 64 bits 32 bits 16 bits (15:0) 8 bits high (15:8) 8 bits low (7:0) Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Le registre RFLAGS 12/73 Le registre rflags contient des informations concernant le résultat de l’exécution d’une instruction. Certains bits du registre appelés drapeaux ont une signification particulière. Seuls les 32 bits de la partie eflags sont utilisés. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Drapeaux du registre RFLAGS 13/73 CF Carry Flag (bit 0) PF Parity Flag (bit 2) AF Auxiliary Carry Flag (bit 4) ZF Zero Flag (bit 6) SF Sign Flag (bit 7) OF Overflow Flag (bit 11) DF Direction Flag (bit 10) TF Task Flag (bit 8) IF Interrupt Flag (bit 9) IOPL I/O Privilege Level (bits 12 et 13) NT Nested Task (bit 14) RF Resume Flag (bit 16) VM Vitrual 8086 Mode (bit 17) AC Alignement Check (bit 18) VIF Virtual Interrupt Flag (bit 19) VIP Virtual Interrupt Pending (bit 20) ID Identification Flag (bit 21) retenue vaut 1 lorsque le résultat est 0 bit de signe du résultat dépassement, le résultat contient trop de bits sens d’incrémentation de ESI et EDI active la gestion de tâche en mode protégé interruption active le mode debug c Sovanna Tan Assembleur intel Intro 14/73 Registres Instructions Structures de contrôle 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Tableaux Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Le langage assembleur Langage de bas niveau Chaque instruction se traduit directement en une instruction binaire pour le processeur. Syntaxe : instruction source ou instruction destination source Types de l’opérande source registre mémoire immédiat, valeur codée dans l’instruction implicite, valeur qui n’apparaı̂t pas dans l’instruction Types de l’opérande destination registre mémoire ATTENTION : Une instruction ne peut pas avoir deux opérandes de type mémoire. 15/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Accès à la mémoire avec l’opérateur [] [cetteAdresse] représente la valeur stockée à l’adresse cetteAdresse. [ceRegistre] représente la valeur stockée à l’adresse contenue dans le registre ceRegistre. On peut associer une étiquette cetteEtiquette à une adresse mémoire et utiliser [cetteEtiquette]. 16/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les directives de données 17/73 Permettent de réserver de l’espace de mémoire dans les segments de données. dx resx dans le segment .data données initialisées dans le segment .bss (Block Started by Symbol) données non initialisées La valeur du caractère x dépend de la taille des données. b w d q t 1 octet (byte) 1 mot (word) 2 mots (double word) 4 mots (quadruple word) 10 octets c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les instructions de déplacement de données mov dest,src dest ← src mov taille dest,src movzx dest,src extension avec des 0 dans dest movsx dest,src extension avec le bit de signe dans dest Tailles possibles : byte 1 octet word 2 octets ou 1 mot dword 2 mots qword 4 mots tword 10 octets On utilise la taille pour lever l’ambiguı̈té dans les instructions quand c’est nécessaire. 1 lea dest,[op] dest ← adresse de op (load effective address) push op décrémente rsp et empile op pop op dépile dans op et incrémente rsp 1. Ce n’est pas réservé à l’instruction mov. 18/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants La pile 19/73 De nombreux processeurs ont un support intégré pour une pile. Une pile est une liste Last-In First-Out (LIFO) : dernier entré, premier sorti. push ajoute une donnée sur la pile de taille qword (64 bits). Cette donnée se trouve au sommet de la pile. pop retire la donnée de taille qword qui se trouve au sommet de la pile. Le registre rsp contient l’adresse de la donnée qui se trouve au sommet de la pile. push décrémente rsp de 8. pop incrémente rsp de 8. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Rôle la pile 20/73 Sauvegarde des registres Passage des paramètres lors de l’appel de sous programme Stockage de variables locales Stockage des adresses de retour Exemple : push qword 1 ; 1 e s t s t o c k e en 0x0FFC , RSP = 0FFC push qword 2 ; 2 e s t s t o c k e en 0 x0FF4 , RSP = 0FF4 push qword 3 ; 3 e s t s t o c k e en 0x0FEC , RSP = 0FEC pop ra x ; RAX = 3 , RSP = 0 x0FF4 pop rbx ; RBX = 2 , RSP = 0x0FFC pop r c x ; RCX = 1 , RSP = 0 x1004 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Les instructions arithmétiques 21/73 add op1,op2 sub op1,op2 neg reg inc reg dec reg imul op (signé ou mul non signé) imul dest,op imul dest,op,immédiat idiv op (div non signé) op1 ← op1 + op2 op1 ← op1 − op2 reg ← −reg reg ← reg + 1 reg ← reg − 1 rdx:rax ← rax ×op dest ← dest × op dest ← op×immédiat rax ← rdx:rax /op, rdx ← rdx:rax mod op 2 2. Ne pas oublier de mettre 0 dans rdx avant d’appeler idiv . c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les opérations sur les bits 22/73 and op1,op2 or op1,op2 xor op1,op2 not reg shl reg,immédiat shr reg,immédiat sal reg,immédiat sar reg,immédiat rol reg,immédiat ror reg,immédiat rcl reg,immédiat rcr reg,immédiat op1 ← op1 & op2 op1 ← op1 | op2 op1 ← op1 ˆ op2 reg ← ˜reg reg ← reg << immédiat reg ← reg >> immédiat reg ← reg << immédiat reg ← reg >> immédiat signé reg ← reg decalageCirculaireGaucheDe imm reg ← reg decalageCirculaireDroiteDe imm reg : CF ← reg : CF decalageCircGauchede imm reg : CF ← reg : CF decalageCircDroitede imm c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Les instructions de comparaison et de branchement 23/73 cmp op1,op2 jmp op jz op jnz op jo op jno op js op jns op jc op jnc op jp op jnp op calcul de op1 − op2 et de ZF,CF et OF branchement inconditionnel à l’adresse op branchement à l’adresse op si ZF=1 branchement à l’adresse op si ZF=0 branchement à l’adresse op si OF=1 branchement à l’adresse op si OF=0 branchement à l’adresse op si SF=1 branchement à l’adresse op si SF=0 branchement à l’adresse op si CF=1 branchement à l’adresse op si CF=0 branchement à l’adresse op si PF=1 branchement à l’adresse op si PF=0 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Les instructions de branchement après cmp op1,op2 24/73 Signées : je op jne op jl op (jnge) jle op (jng) jg op (jnle) jge op ( jnl ) Non signées : je op jne op jb op (jnae) jbe op (jna) ja op (jnbe) jae op (jnb) branchement branchement branchement branchement branchement branchement à à à à à à l’adresse l’adresse l’adresse l’adresse l’adresse l’adresse op op op op op op si si si si si si op1 = op2 op1 6= op2 op1 < op2 op1 ≤ op2 op1 > op2 op1 ≥ op2 branchement branchement branchement branchement branchement branchement à à à à à à l’adresse l’adresse l’adresse l’adresse l’adresse l’adresse op op op op op op si si si si si si op1 = op2 op1 6= op2 op1 < op2 op1 ≤ op2 op1 > op2 op1 ≥ op2 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Exemple de branchement i f ( a>b ) { if : cmp r12 , r13 jng e l s e mov qword r d i , f o r m a t mov qword r s i , r12 mov qword rax , 0 call printf jmp e n d i f p r i n t f ( ”%d” , a ) ; } else { 25/73 else : mov qword r d i , f o r m a t mov qword r s i , r13 mov qword rax , 0 call printf p r i n t f ( ”%d” , b ) ; } endif : c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les boucles Les instructions suivantes sont déconseillées car elles ne permettent qu’un branchement à une distance inférieure à 127 octets. loop op décrémente rcx et saut à op si rcx6= 0 loope op (loopz) rcx−− et saut à op si rcx6= 0 et ZF=1 loopne op (loopnz) rcx−− et saut à op si rcx6= 0 et ZF=0 Exemple : mov rcx , 1 0 f o r ( i n t a =10; a >0; a−−){ 26/73 for1 : push r c x mov qword r d i , f o r m a t mov qword r s i , r c x mov qword rax , 0 call printf pop r c x loop f o r 1 p r i n t f ( ”%d” , a ) } c Sovanna Tan Assembleur intel Intro 27/73 Registres Instructions Structures de contrôle 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Tableaux Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes if i f ( a>b ) { if1 : ... } else { ... } else1 : ... endif1 : i f ( ( a > b ) && ( c <= d ) ) { i f 2 : 28/73 ... } cmp rax , rbx jng e l s e 1 ... jmp e n d i f 1 cmp rax , rbx jng e n d i f 2 cmp rcx , rdx jnle endif2 ... endif2 : c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants switch 29/73 switch ( i ) { case 1 : ... break ; case 2 : ... break ; default : ... } ... switcha : casea2 : cmp jne ... jmp cmp jne ... jmp defaulta : ... endswitcha : ... c Sovanna Tan Assembleur intel rcx , 1 casea2 endswitcha rcx , 2 defaulta endswitcha Intro Registres Instructions Structures de contrôle Tableaux Sous programmes while, do while w h i l e ( a >0){ ... a−−; } do { ... a−−; 30/73 w h i l e 1 : cmp jle ... dec jmp endwhilei1 : rax , 0 endwhile1 rax while1 ... do2 : ... dec r a x ; cmp rax , 0 j g do2 } w h i l e ( a >0); c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes for f o r ( i n t i =1; i <10; i ++){ for1 : mov rcx , 1 jmp t e s t 1 next1 : ... test1 : } ... 31/73 c Sovanna Tan ... inc rcx cmp rcx , 1 0 j l next1 ... Assembleur intel Flottants Intro 32/73 Registres Instructions Structures de contrôle 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Tableaux Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les tableaux 33/73 Bloc continu de données en mémoire Tous les éléments sont de même type et de même taille. L’adresse de chaque élément du tableau se calcule à partir de l’adresse du premier élément du tableau ; le nombre d’octets de chaque élément ; l’indice de l’élément. L’indice du premier élément du tableau est 0. Tableau à deux dimensions : tableau de tableaux à une dimension. Se généralise pour les dimensions supérieures. Chaı̂ne de caractères : tableau d’octets dont le dernier élément est 0. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Exemples de définition de tableau 34/73 segment . d a t a ; d e f i n i t un t a b l e a u de 10 d o u b l e s mots i n i t i a l i s e s ; a 1 ,2 , . . ,10 a1 dd 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ; d e f i n i t un t a b l e a u de 10 q u a d r u p l e s mots i n i t i a l i s e s a a2 dq 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ; idem m ai s en u t i l i s a n t t i m e s a3 t i m e s 10 dq 0 ; d e f i n i t un t a b l e a u d ’ o c t e t s a v e c 200 0 p u i s 100 1 a4 t i m e s 200 db 0 t i m e s 100 db 1 segment . b s s ; d e f i n i t un a5 resd ; d e f i n i t un a6 resw t a b l e a u de 10 d o u b l e s mots non i n i t i a l i s e s 10 t a b l e a u de 100 mots non i n i t i a l i s e s 100 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple d’accès aux éléments d’un tableau 35/73 array1 array2 db 5 0 , 4 0 , 3 0 , 2 0 0 , 100 ; t a b l e a u d ’ o c t e t s dw 5 , 4 , 3 , 2 , 1 ; t a b l e a u de mots mov mov mov mov mov mov mov al , [ a r r a y 1 ] a l , [ a r r a y 1 +1] [ array1 + 3] , al ax , [ a r r a y 2 ] ax , [ a r r a y 2 + 2 ] [ a r r a y 2 + 6 ] , ax ax , [ a r r a y 2 +1] ; ; ; ; ; ; ; a l=a r r a y 1 [ 0 ] a l=a r r a y 1 [ 1 ] a r r a y 1 [3]= a l ax=a r r a y 2 [ 0 ] ax=a r r a y 2 [ 1 ] a r r a y 2 [ 3 ] = ax ax =?? Calcul de la somme des éléments du tableau array1 mov rbx , a r r a y 1 ; r b x = a d r e s s e de a r r a y 1 mov rdx , 0 ; dx c o n t i e n d r a l a somme mov rcx , 5 ; i n i t i a l i s a t i o n compteur b o u c l e next1 : add dl , [ rbx ] jnc s u i t e 1 i n c dh ; d l += ∗ ebx ; s i p a s de r e t e n u e g o t o s u i t e 1 ; i n c r e m e n t e dh quand r e t e n u e i n c rbx dec r c x cmp rcx , 0 jg next1 ; bx++ suite1 : c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Adressage indirect 36/73 L’adressage indirect facilite l’accès aux éléments d’un tableau ou de la pile. [ d e p l a c e m e n t+r e g i s t r e b a s e+f a c t e u r ∗ r e g i s t r e i n d e x ] registre base et registre index sont des registres généraux facteur vaut 1, 2, 4 ou 8 (omis lorsqu’il vaut 1). deplacement est une étiquette. c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple : tri par sélection (1) extern p r i n t f segment . d a t a l o n g I n t F o r m a t db ”%l d ” , 0 s t r i n g F o r m a t db ”%s ” , 0 newLine db 1 0 , 0 a dq 7 , 5 , 2 , 1 8 , 1 4 , 8 segment . b s s ; t r i p a r s e l e c t i o n du t a b l e a u b ; e l e m e n t s de a n u m e r o t e s de 0 a n−1 ; p o u r i de 0 a n−2 ; min <− i ; p o u r j de i + 1 a n−1 ; s i a [ j ] < a [ min ] min <− j ; s i min != i e c h a n g e r a [ i ] e t a [ min ] segment . t e x t g l o b a l asm main asm main : ; sauvegarde pointeur p i l e push r b p mov rbp , r s p push r 1 2 37/73 for1 : mov r c x , 0 jmp t e s t 1 ; rbx c o n t i e n t a [ rcx ] n e x t 1 : mov rbx , [ a+8∗ r c x ] mov rdx , r c x push r c x inc rdx if1 : cmp rbx , [ a+8∗r d x ] jng endif1 ; v a l e u r min d a n s r b x mov rbx , [ a+8∗r d x ] ; s a u v e g a r d e de i n d i c e min s u r p i l e push r d x e n d i f 1 : inc rdx t e s t 2 : cmp rdx , 6 jl if1 ; min d a n s r b x , e c h a n g e mov r a x , [ a+8∗ r c x ] mov [ a+8∗ r c x ] , r b x pop r d x mov [ a+8∗r d x ] , r a x inc rcx t e s t 1 : cmp r c x , 5 j l next1 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Exemple : tri par sélection (2) Exécution du programme ; a f f i c h a g e du t a b l e a u mov r12 , 0 jmp t e s t 3 ./trisel1 2 5 7 8 14 18 next3 : mov r d i , l o n g I n t F o r m a t mov r s i , [ a+8∗r 1 2 ] mov r a x , 0 call printf i n c r12 t e s t 3 : cmp r12 , 6 j l next3 mov r d i , s t r i n g F o r m a t mov r s i , n e w L i n e mov r a x , 0 call printf ; restauration pointeur pile pop r 1 2 mov r s p , r b p pop r b p 38/73 mov r a x , 0 ret c Sovanna Tan Assembleur intel Sous programmes Flottants Intro 39/73 Registres Instructions Structures de contrôle 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Tableaux Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Appel de sous programme Sous programme Partie du code écrite une seule fois que l’on peut exécuter à partir de différents endroits du programme. Implémentation des procédures et des fonctions des langages de haut niveau. A la fin de l’exécution d’un sous programme, l’exécution doit se poursuivre avec l’instruction qui suit l’appel. Impossible à implémenter avec une étiquette. Il faut mémoriser l’adresse de retour et faire un saut à cette adresse en utilisant l’adressage indirect. On dispose des instructions suivantes : call op saut inconditionnel à op et empile l’adresse de l’instruction suivante ret dépile une adresse et saute à cette adresse Attention à la gestion de la pile ! 40/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants La valeur de retour des fonctions 41/73 Elles sont passées par des registres : rax pour un pointeur ou un type entier de taille inférieure ou égale à 64 bits (Les valeurs sont étendues sur 64 bits.) ; rdx:rax pour une valeur 128 bits ; xmm0 pour une valeur flottante ou xmm1:xmm0 si besoin. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple : calcul de n2 − 1 extern p r i n t f segment . d a t a formatSortie1 formatSortie2 db ”6ˆ2−1 v a u t : %l d ” , 1 0 , 0 db ”8ˆ2−1 v a u t : %l d ” , 1 0 , 0 segment . b s s segment . t e x t global asm main asm main : ; sauvegarde des r e g i s t r e s sur l a push r b p ; 1 e r a p p e l de l a f o n c t i o n mov r d i , 6 c a l l fonc1 ; appel p r i n t f mov r d i , f o r m a t S o r t i e 1 mov r s i , r a x mov r a x , 0 call printf ; 2eme a p p e l de l a f o n c t i o n mov r d i , 8 c a l l fonc1 42/73 pile ; appel p r i n t f mov r d i , f o r m a t S o r t i e 2 mov r s i , r a x mov r a x , 0 call printf ; r e s t a u r a t i o n des r e g i s t r e s pop r b p ; e n v o i de 0 au programme C mov r a x , 0 ret ; c o d e de l a f o n c t i o n fonc1 : push r b p mov rbp , r s p imul rdi , r d i sub r d i , 1 mov r a x , r d i mov r s p , r b p pop r b p ret c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Code réentrant Sous programme réentrant Un sous programme réentrant peut être utilisé simultanément par plusieurs tâches. Une seule copie du code en mémoire peut être utilisée par plusieurs utilisateurs en même temps. Pour cela, le sous programme réentrant ne doit pas : modifier son code ; modifier les données globales comme celles des segments .data et .bss . Toutes les variables locales doivent être stockées sur la pile. 43/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Calcul récursif Sous programme récursif Un sous programme récursif est un sous programme qui s’appelle lui même : directement ; ou indirectement par l’intermédiaire d’autres appels de fonctions. Un sous programme récursif doit avoir une condition de terminaison pour que le programme s’arrête, sinon il engendre une erreur à l’exécution lorsque les ressources sont épuisées. Un sous programme réentrant peut s’appeler de manière récursive. 44/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les variables locales 45/73 On alloue l’espace requis par les variables locales en diminuant rsp. La taille des blocs doit être un multiple de 16 pour Windows et Linux. On peut alors mettre les valeurs des variables locales dans [rsp], [rsp+8],... A la fin du sous programme, on libère l’espace mémoire correspondant avec mov rsp,rbp c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Les instructions enter et leave Simplifient l’écriture des sous programmes. e n t e r TAILLE VAR LOC , 0 push rbp mov rbp , r s p sub rsp , TAILLE VAR LOC ... ... ; code du s s p r o g leave ret 46/73 ; code du s s p r o g mov rsp , rbp pop rbp ret TAILLE VAR LOC doit être un multiple de 16. Le pointeur rsp doit contenir la valeur 0 en hexadécimal pour le chiffre des unités. Les systèmes d’exploitation Windows et Linux demandent le maintien du pointeur de pile aligné sur un bloc de 16 octets. Sa valeur en hexadécimal doit contenir 0 pour le chiffre des unités. Un appel de fonction avec la valeur 8 en hexadécimal pour le chiffre des unités de rsp conduit à une segmentation fault. c Sovanna Tan Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes La pile des appels de fonctions (stack frame) 47/73 Comme chaque call empile, l’adresse de l’instruction à exécuter après le retour de l’appel, le fait de commencer un appel de fonction par e n t e r TAILLE VAR LOC , 0 ou push rbp mov rbp , r s p sub rsp , TAILLE VAR LOC et de le terminer par leave permet au débogueur de remonter la pile des appels de fonctions. c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple de sous programme récursif : calcul de n! extern p r i n t f segment . d a t a f o r m a t S o r t i e 1 db ” 5 ! v a u t : %l d ” , 1 0 , 0 segment . b s s segment . t e x t global asm main asm main : ; sauvegarde des r e g i s t r e s sur l a p i l e push r b p ; a p p e l de l a f o n c t i o n p o u r n=5 mov r d i , 5 call fact ; appel p r i n t f mov r d i , f o r m a t S o r t i e 1 mov r s i , r a x mov r a x , 0 call printf ; r e s t a u r a t i o n des r e g i s t r e s pop r b p mov rax , 0 ret 48/73 fact : ; une v a r i a b l e l o c a l e e n t i e r e enter 16 ,0 ; s a u v e g a r d e du p a r a m e t r e n mov [ r s p ] , r d i ; c a s n==1 cmp r d i , 1 j e term cond ; c a s <>1 c a l c u l de f a c t ( n−1) dec r d i call fact ; f a c t ( n)= f a c t ( n−1)∗n imul rax , [ r s p ] jmp e n d f a c t term cond : ; f a c t (1)=1 mov r a x , 1 end fact : leave ret c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Conventions d’appel d’un sous programme 49/73 Lors de l’appel d’un sous programme, le code appelant et le sous programme doivent se coordonner pour le passage des paramètres. Ce processus est normalisé dans les langages de haut niveau. Ce sont les conventions d’appel. Au niveau de l’assembleur, il n’y a pas de norme. Les conventions diffèrent d’un compilateur à l’autre. Pour interfacer, l’assembleur avec un langage de haut niveau l’assembleur doit suivre les conventions d’appel du langage de haut niveau. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Contenu de la convention d’appel 50/73 Où le code appelant place-t-il les paramètres : sur la pile ou dans des registres ? Quand les paramètres sont placés sur la pile, dans quel ordre y sont-ils placés : du premier au dernier ou du dernier au premier ? Quand les paramètres sont placés sur la pile, qui doit nettoyer la pile suite à l’appel : le code appelant ou le code du sous programme ? Quels sont les registres préservés (callee-save) que le sous programme doit sauver avant d’utiliser et restaurer à la fin et les registres de travail (caller-save) dont l’appelant a sauvé le contenu et qui peuvent être utilisés par le sous programme à volonté ? Où se trouve la valeur de retour d’une fonction ? c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Le passage des paramètres 51/73 Le passage des paramètres peut se faire par les registres comme dans les fonctions fonc1 et fact . S’il y a trop de paramètres, il faut en passer certains par la pile. On empile les paramètres avant le call . Si le sous programme doit modifier le paramètre, il faut passer l’adresse de la donnée à modifier. Si la taille du paramètre est inférieure à celle d’un qword, il faut l’étendre avant de l’empiler. Les paramètres ne sont pas dépilés par le sous programme mais on y accède depuis la pile. L’adresse de retour empilée par call doit être dépilée en premier. Les paramètres peuvent être utilisés plusieurs fois dans le sous programme. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les conventions d’appel du C (cdecl) 52/73 Les paramètres sont empilés dans l’ordre inverse de celui dans lequel ils sont écrits dans la fonction C. Utilisation du registre rbp pour accéder aux paramètres passés par la pile (écriture simplifiée avec enter et leave). Le sous programme doit empiler rbp avec push rbp puis copier rsp dans rbp avec mov rbp,rsp. On accède aux paramètres en utilisant rbp. Les paramètres sont [rbp+16], [rbp+24]... Cela permet de continuer à utiliser la pile dans le sous programme pour stocker les variables locales afin d’écrire du code réentrant. On alloue l’espace requis par les variables locales en diminuant rsp. A la fin du sous programme, on libère l’espace mémoire correspondant avec mov rsp,rbp A la fin de l’appel, le sous programme doit restaurer la valeur de rbp avec pop rbp . Le code appelant doit retirer les paramètres de la pile. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Différences entre Linux et Windows Linux Les six premiers paramètres entiers sont passés dans rdi , rsi , rdx, rcx, r8 et r9 dans cet ordre. Les autres sont passés par la pile. Ces registres, ainsi que rax, r10 et r11 sont détruits par les appels de fonctions. Les registres callee-save sont rbx, r12, ... , r15. Les paramètres flottants sont passés dans xmm0, xmm1,..., xmm7. Windows Les quatre premiers paramètres entiers sont passés dans rcx, rdx, r8 et r9 dans cet ordre. Les autres sont passés par la pile. Ces registres, ainsi que rax, r10 et r11 sont détruits par les appels de fonctions. La valeur de retour entière est contenue seulement dans rax. Les paramètres flottants sont passés dans xmm0, xmm1, xmm2 et xmm3. La valeur de retour flottante est contenue seulement dans xmm0. 53/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants D’autres conventions 54/73 sdtcall : Le sous programme doit retirer les paramètres de la pile. Cela empêche l’écriture de fonctions à nombre variable d’arguments comme printf ou scanf. Utilisée dans l’API Microsoft. Avec gcc, on peut préciser cdecl ou sdtcall dans le code C. Pascal : Les paramètres sont empilés dans l’ordre où ils apparaissent dans la fonction, de gauche à droite. Le sous programme doit retirer les paramètres de la pile. Utilisée dans Delphi de Borland. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Fonction qui affiche un tableau d’entier extern p r i n t f segment . d a t a l o n g I n t F o r m a t db ”%l d ” , 0 s t r i n g F o r m a t db ”%s ” , 0 newLine db 1 0 , 0 a dq 7 , 5 , 2 , 1 8 , 1 4 , 8 segment . b s s segment . t e x t g l o b a l asm main asm main : push r b p ; a f f i c h e l e s 6 e l e m e n t s du t a b l e a u mov r d i , a mov r s i , 6 call affichage ; affiche 3 e l e m e n t s a p a r t i r du 2eme mov r d i , a add r d i , 1 6 mov r s i , 3 call affichage 55/73 ; a f f i c h a g e du t a b l e a u affichage : push r b p mov rbp , r s p mov rbx , r d i mov r13 , r s i mov r12 , 0 jmp t e s t 3 n e x t 3 : mov r d i , l o n g I n t F o r m a t mov r s i , [ r b x+8∗r 1 2 ] mov r a x , 0 call printf i n c r12 t e s t 3 : cmp r12 , r 1 3 j l next3 mov r d i , s t r i n g F o r m a t mov r s i , n e w L i n e mov r a x , 0 call printf pop r b p mov r a x , 0 ret leave mov r a x , 0 ret ./ afftab 7 5 2 18 14 8 2 18 14 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Tri par sélection avec fonctions (1) extern p r i n t f segment . d a t a l o n g I n t F o r m a t db ”%l d ” , 0 s t r i n g F o r m a t db ”%s ” , 0 newLine db 1 0 , 0 a dq 7 , 5 , 2 , 1 8 , 1 4 , 8 b dq 2 7 , 3 5 , 1 2 , 2 5 , 1 9 , 1 2 , 34 segment . b s s ; t r i p a r s e l e c t i o n du t a b l e a u t ; e l e m e n t s de a n u m e r o t e s de 0 a n−1 ; p o u r i de 0 a n−2 ; min <− i ; p o u r j de i + 1 a n−1 ; s i t [ j ] < t [ min ] min <− j ; s i min != i e c h a n g e r t [ i ] e t t [ min ] segment . t e x t g l o b a l asm main asm main : push r b p ; a p p e l de l a f o n c t i o n t r i s e l ; l e p r e m i e r p a r a m e t r e , a d r e s s e du t a b l e a u , ; e t l e d e u x i e m e p a r a m e t r e , t a i l l e du t a b l e a u ; sont p a s s e s dans l e s r e g i s t r e s r d i e t r s i , ; l e t r o i s i e m e p a r a m e t r e , nombre d ’ e l e m e n t s ; a t r i e r , e s t passe par l a p i l e 56/73 ; t r i de a mov r d i , a mov r s i , 6 push 6 call trisel add r s p , 8 ; a f f i c h a g e du t a b l e a u mov r d i , a mov r s i , 6 call affichage : t r i d e s 5 p r e m i e r s e l e m e n t s de b mov r d i , b mov r s i , 7 push 5 call trisel add r s p , 8 ; a f f i c h a g e du t a b l e a u mov r d i , b mov r s i , 7 call affichage pop r b p mov r a x , 0 ret c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Tri par sélection avec fonctions (2) ; f o n c t i o n de t r i trisel : enter 0 ,0 mov r12 , r d i mov r14 , r s i mov r13 , [ r b p +16] dec r 1 3 for1 : mov r c x , 0 jmp t e s t 1 ; rbx c o n t i e n t t [ rcx ] next1 : ; sauvegarde des r e g i s t r e s ; e t a f f i c h a g e du t a b l e a u push r c x push r d x mov r d i , r 1 2 mov r s i , r 1 4 call affichage pop r d x pop r c x 57/73 mov rbx , [ r 1 2+8∗ r c x ] mov rdx , r c x push r c x inc rdx if1 : cmp rbx , [ r 1 2+8∗r d x ] jng endif1 ; v a l e u r min d a n s r b x mov rbx , [ r 1 2+8∗r d x ] ; s a u v e g a r d e de i n d i c e min s u r p i l e push r d x e n d i f 1 : inc rdx t e s t 2 : cmp rdx , [ r b p +16] jl if1 ; min d a n s r b x , e c h a n g e mov r a x , [ r 1 2+8∗ r c x ] mov [ r 1 2+8∗ r c x ] , r b x pop r d x mov [ r 1 2+8∗r d x ] , r a x inc rcx t e s t 1 : cmp r c x , r 1 3 j l next1 leave ret c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Tri par sélection avec fonctions (3) 58/73 ./trisel2 7 5 2 18 14 8 2 5 7 18 14 8 2 5 7 18 14 8 2 5 7 18 14 8 2 5 7 8 14 18 2 5 7 8 14 18 27 35 12 25 19 12 35 27 25 19 12 19 27 25 35 12 19 25 27 35 12 19 25 27 35 12 12 12 12 12 34 34 34 34 34 c Sovanna Tan Assembleur intel Sous programmes Flottants Intro 59/73 Registres Instructions Structures de contrôle 1 Introduction 2 Les registres 3 Les instructions 4 Les structures de contrôle 5 Les tableaux 6 Les sous programmes 7 Les calculs flottants c Sovanna Tan Tableaux Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants L’unité de calcul flottant (FPU : Floating Point Unit) 60/73 Au début, elle était un circuit séparé, le coprocesseur mathématique. Puis, elle a été intégrée au microprocesseur, mais se programmait toujours de façon distincte. Avec les architectures 64 bits, apparaı̂t un nouveau jeu d’instructions SSE (Streaming SIMD (Single Instruction Multiple Data) Extensions) pour des registres de taille 128 ou 256 bits selon les processeurs. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les types de nombres flottants 61/73 Simple précision IEEE 754-2008 : 1 bit signe, 8 bits exposant, 23 bits mantisse Double précision IEEE 754-2008 : 1 bit signe, 11 bits exposant, 52 bits mantisse Precision étendue intel 80 bits : 1 bit signe, 15 bits exposant, 64 bits mantisse Ce format est différent des formats IEEE 754-2008. Dans le processeur Intel 32 bits, tous les calculs étaient effectués en précision étendue puis convertis en simple ou double précision IEEE 754-2008. Quadruple précision IEEE 754-2008 : 1 bit signe, 15 bits exposant, 112 bits mantisse 256 bits (extrapolation de IEEE 754-2008) : 1 bit signe, 19 bits exposant, 236 bits mantisse c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les registres 62/73 16 registres généraux xmm0, xmm1,... et xmm15. Ces registres peuvent être utilisés avec des instructions pour une seule valeur ou pour un vecteur de valeurs. Ce vecteur comporte alors soit 4 floats soit 2 doubles. Les processeurs de la série i-core ont 16 registres 256 bits ymm0, ymm1,... et ymm15. Les registres xmm0, xmm1,... et xmm15 correspondent aux premiers 128 bits des registres ymm0, ymm1,... et ymm15. Ces derniers peuvent être vu comme des vecteurs de 8 floats ou 4 doubles. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les instructions de déplacement de données Déplacement d’une seule valeur movsd dest,src déplacement d’un flottant double movss dest,src déplacement d’un flottant simple (float) Déplacement de paquets (plusieurs valeurs simultanément) movapd dest,src déplacement de 2 doubles alignés 3 movaps dest,src déplacement de 4 floats alignés movdqa dest,src déplacement d’un double qword aligné movupd dest,src déplacement de 2 doubles non alignés movups dest,src déplacement de 4 floats non alignés movdqu dest,src déplacement d’un double qword non aligné Les noms des instructions pour les registres 256 bits commencent par v, vmovapd, vmovaps,... 3. alignés sur 1 bloc de 16 octets 63/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Calculs flottants 64/73 addsd dest,src addss dest,src addpd dest,src addps dest,src subsd dest,src subss dest,src subpd dest,src subps dest,src mulsd dest,src mulss dest,src mulpd dest,src mulps dest,src divsd dest,src divss dest,src divpd dest,src divps dest,src addition de 2 doubles addition de 2 floats 2 doubles + 2 doubles 4 floats + 4 floats soustraction de 2 doubles soustraction de 2 floats 2 doubles - 2 doubles 4 floats - 4 floats multiplication de 2 doubles multiplication de 2 floats 2 doubles * 2 doubles 4 floats * 4 floats division de 2 doubles division de 2 floats 2 doubles / 2 doubles 4 floats / 4 floats dest doit être un registre flottant. c Sovanna Tan Assembleur intel Sous programmes Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les instructions de conversion 65/73 cvtss2sd dest,src cvtps2pd dest,src cvtsd2ss dest,src cvtpd2ps dest,src cvtss2si cvtsd2si cvtsi2ss cvtsi2sd dest,src dest,src dest,src dest,src convertit un float en double convertit un paquet de 2 floats en un paquet de 2 doubles convertit un double en float convertit un paquet de 2 doubles en un paquet de 2 floats convertit un float en dword ou qword convertit un double en dword ou qword convertit un entier en float convertit un entier en double Lorsque l’opérande source est dans la mémoire, il faut préciser la taille de la donnée à lire. c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les instructions de comparaison comisd op1,op2 comiss op1,op2 ucomisd op1,op2 ucomiss op1,op2 comparaison comparaison comparaison comparaison ordonnée de deux doubles ordonnée de deux floats non ordonnée de deux doubles non ordonnée de deux floats op1 doit être un registre, ,op2 peut être un registre ou une valeur en mémoire. Les instructions mettent à jour les drapeaux ZF, PF et CF. Les comparaisons non ordonnées lèvent une exception si l’un des opérandes vaut SNaN (Signaling Not a Number i.e. que des 1 dans l’exposant et mantisse de la forme 0x) et les comparaisons ordonnées lèvent une exception si l’un des deux opérandes vaut SNaN ou QNaN (Quiet Not a Number i.e. que des 1 dans l’exposant et mantisse de la forme 1x). 66/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Les branchements conditionnels pour les flottants 67/73 Après une instruction de comparaison de flottants (comisd, comiss, ucomisd ou ucomiss) entre op1 et op2 : jb op jbe op ja op jae op branchement branchement branchement branchement à à à à op op op op si si si si op1 op1 op1 op1 c Sovanna Tan < ≤ > ≥ op2 op2 op2 op2 CF=1 CF=1 ou ZF=1 CF=1 CF=1 ou ZF=1 Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Arrondis 68/73 roundsd dest,src,mode roundss dest,src,mode roundpd dest,src,mode roundps dest,src,mode arrondi src de type double dans dest arrondi src de type float dans dest arrondi des 2 doubles de src dans dest arrondis des 4 floats de src dans dest dest doit être un registre flottant. mode est un opérande immédiat : 0 arrondi à la valeur entière paire la plus proche 1 arrondi à la valeur entière inférieure 2 arrondi à la valeur supérieure 3 arrondi à la valeur absolue inférieure (à la valeur entière la plus proche de 0) c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Flottants Instructions diverses minsd dest,src minss dest,src minpd dest,src minps dest,src maxsd dest,src maxss dest,src maxpd dest,src maxps dest,src sqrtsd dest,src sqrtss dest,src sqrtpd dest,src sqrtps dest,src minimun de 2 doubles (src et dest) dans dest minimun de 2 floats (src et dest) dans dest 2 calculs de minimun de 2 doubles dans dest 4 calculs de minimun de 2 floats dans dest maximun de 2 doubles (src et dest) dans dest maximun de 2 floats (src et dest) dans dest 2 calculs de maximun de 2 doubles dans dest 4 calculs de maximun de 2 floats dans dest racine carrée de src de type double dans dest racine carrée de src de type float dans dest 2 racines carrées de src(2 doubles) dans dest 4 racines carrées de src(4 floats) dans dest dest doit être un registre flottant. 69/73 c Sovanna Tan Assembleur intel Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple : calcul de la valeur d’un polynôme (1) extern printf , scanf lea rdi , [ coeff ] segment . d a t a movsd xmm0, [ y ] coeff dq 1 .0 , 2 .0 , 3 .0 , 4 . 0 mov esi , 3 x dq 2 .0 call horner p r o m p t D o u b l e db ”% l f ” , 0 mov r d i , p r o m p t 2 D o u b l e l n p r o m p t 1 D o u b l e l n db ” 4 x3+3x2+2x+1 ( 2 ) = % l f ” , 1 0 , 0 movsd xmm1, xmm0 movsd xmm0, [ y ] p r o m p t 2 D o u b l e l n db ” 4 x3+3x2+2x+1 (% l f ) = % l f ” , 1 0 , 0 mov r a x , 2 p r o m p t E n t r e r db ” E n t r e z x : ” , 0 call printf segment . b s s y resq 1 xor eax , eax leave segment . t e x t ret global asm main , h o r n e r ; e x t r a i t du l i v r e de Ray S e y f a r t h asm main : h o r n e r : movsd xmm1, xmm0 push rbp ; u s e xmm1 a s x mov rbp , r s p movsd xmm0, [ r d i+ r s i ∗ 8 ] lea rdi , [ coeff ] ; accumulator f o r b k movsd xmm0, [ x ] mov esi , 3 cmp esi , 0 call horner ; i s t h e d e g r e e 0? mov r d i , p r o m p t 1 D o u b l e l n jz done mov r a x , 1 more : sub esi , 1 call printf mulsd xmm0, xmm1 mov r d i , p r o m p t E n t r e r ; b k ∗ x addsd xmm0, [ r d i+ r s i ∗ 8 ] mov r a x , 0 ; add p k call printf mov r d i , p r om p tD o u bl e jnz more done : ret mov r s i , y mov r a x , 0 c a l l scanf 70/73 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple : calcul de la valeur d’un polynôme (2) 71/73 . / horner 4 x3+3x2+2x+1 ( 2 ) = 49 . 0 0 0 0 0 0 Entrez x : 3 4 x3+3x2+2x+1 ( 3 . 0 0 0 0 0 0 ) = 142 . 0 0 0 0 0 0 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple : calcul de la somme de deux vecteurs (1) extern p r i n t f mov rdi , b segment . d a t a mov rsi , 8 a dq 1 . 0 , 2 . 0 , 3 . 0 , 4 . 0 , 5 . 0 , 6 . 0 , 7 . 0 , 8 . 0 call affichage b dq 2 . 0 , 0 . 5 , 4 . 0 , 0 . 2 , 3 . 0 , 1 . 5 , 0 . 5 , 0 . 4 mov rdi , c f l o a t F o r m a t db ”% l f ” , 0 mov rsi , 8 promptRes db ” a∗b=” , 0 call affichage p r o m p t l n db 1 0 , 0 mov rax , 0 segment . b s s leave c resq 8 ret segment . t e x t global asm main , h o r n e r affichage : enter 0 ,0 asm main : push r 1 2 push rbp push r 1 3 mov rbp , r s p push r 1 4 mov r c x , 0 push r b x mov rdx , 8 jmp t e s t 1 mov rbx , r d i n e x t 1 : movapd xmm0 , [ a+8∗ r c x ] mov r13 , r s i movapd xmm1 , [ b+8∗ r c x ] mov r12 , 0 addpd xmm1, xmm0 jmp t e s t 3 movapd [ c+8∗ r c x ] , xmm1 n e x t 3 : mov r d i , f l o a t F o r m a t add r c x , 2 movsd xmm0 , [ r b x+8∗r 1 2 ] t e s t 1 : cmp r c x , r d x mov r a x , 1 j l next1 call printf i n c r12 mov rdi , a t e s t 3 : cmp r12 , r 1 3 mov rsi , 8 j l next3 call affichage 72/73 c Sovanna Tan Assembleur intel Flottants Intro Registres Instructions Structures de contrôle Tableaux Sous programmes Exemple : calcul de la somme de deux vecteurs (2) 73/73 mov r d i , p r o m p t l n mov r a x , 0 call printf pop r b x pop r 1 4 pop r 1 3 pop r 1 2 mov r a x , 0 leave ret . / addvect 1 .000000 2 .000000 3 .000000 4 .000000 5 .000000 6 .000000 7 .000000 8 .000000 2 .000000 0 .500000 4 .000000 0 .200000 3 .000000 1 .500000 0 .500000 0 .400000 3 .000000 2 .500000 7 .000000 4 .200000 8 .000000 7 .500000 7 .500000 8 .400000 c Sovanna Tan Assembleur intel Flottants