Created with colorer-take5 library. Type 'c' int main( ) { int retour ; retour = maFonctionAss( ) ; /* On appelle la fonction assembleur */ return retour ; }
Created with colorer-take5 library. Type 'asm' ;Début des données segment .data mess1: db "Hello world", 0 ; le 0 de fin de chaîne( convention) ;Début des données non initialisées segment .bss resb 5 ;exemple: on réserve 5 octets ;Début du code segment .text global _maFonctionAss ; par défaut n'aurait pas été utilisable à l'extérieur! _maFonctionAss: ;(...) ret
Created with colorer-take5 library. Type 'asm' ;Début des données segment .data ;données initialisées ;Début des données non initialisées segment .bss ;données non initialisées ;Début du code segment .text global _maFonctionAss ; par défaut n'aurait pas été utilisable à l'extérieur! _maFonctionAss: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;(...) popa mov eax, valeur_de_retour_fonction ; on peut mettre 0 si pas de valeur de retour leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret
Created with colorer-take5 library. Type 'asm' ;Début des données segment .data caractA: db 'A' ;Début des données non initialisées segment .bss resb 5 ;exemple: on réserve 5 octets ;Début du code segment .text global _maFonctionAss ; par défaut n'aurait pas été utilisable à l'extérieur! _maFonctionAss: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;début vrai code de notre fonction mov al, [caractA] mov ah, 0Eh ;permet de préciser quelle fonction de l'interruption 10h on veut: la fonction d'affichage d'un caractère correspond à 0Eh dans ah int 10h ;interruption BIOS pour fonctions vidéos ;fin vrai code de notre fonction popa mov eax, 0 ; on peut mettre 0 si pas de valeur de retour leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret
Created with colorer-take5 library. Type 'c' int main() { int retour ; retour = maFonctionAss(); return retour; }
Created with colorer-take5 library. Type 'asm' PUSH EBP ; on sauvegarde EBP MOV EBP, ESP ; on initialise EBP avec ESP, et en même temps cela sauvegarde ESP
Created with colorer-take5 library. Type 'asm' MOV ESP, EBP ;EBP contient le ESP du début. On ne l’a pas modifié depuis. POP EBP ;
Created with colorer-take5 library. Type 'asm' ;helloWorld.asm ;07/04/2008 ;Programme d'exemple d'affichage de "Hello World", en utilisant un appel à une ;fonction du C(printf), depuis l'assembleur. ; ;Début des données segment .data phraseBonjour: db "Hello World", 0 formatString: db "%s", 0; ;Début des données non initialisées segment .bss ;Début du code segment .text extern _printf ;pour le programme assembleur, on déclare explicitement que _printf existe ailleurs global _monMain ; par défaut n'aurait pas été utilisable à l'extérieur, donc on doit le mettre! _monMain: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha pushf ;début vrai code de notre fonction mov eax, phraseBonjour call affiche_string ;fin vrai code de notre fonction popf popa mov eax, 0 ; on peut mettre 0 si pas de valeur de retour leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret global afficheString ; global, pour être accessible aux autres fichiers assembleurs affiche_string: ;Fonction affichant une string. ;Un paramètre, mis dans le registre eax: ;IN, dans eax: l'adresse d'une string contenant le message à afficher ;Cette fonction utilise la fonction printf de la librairie C. pusha pushf ;sauvegarde du registre flags push eax ; on empile le deuxième paramètre de _printf push dword formatString ;om empile le premier paramètre de _prinf call _printf pop ecx ;ne pas oublier de dépiler les deux paramètres, sinon, à la fin de la fonction, il va dépiler un double word pop ecx ;pour connaitre l'adresse de retour, et il va prendre l'adresse de formatString pour l'adresse de retour! popf popa ret
Created with colorer-take5 library. Type 'c' /* Programme lanceur.c */ /* Auteur: Sabri Koffler */ /* Date: 07/04/2008 */ /* Programme générique de lancement d'un programme assembleur */ /* Par exemple, permet de lancer le programme helloWorld.asm */ /* La fonction principale assembleur est appelé monMain, car c'est l'équivalent d'un main */ /* pour le programme assembleur. */ /* Exemple de compilation : */ /* nasm -f coff helloWorld.asm : on crée le fichier objet de notre programme assembleur d'abord gcc -o helloWorld.exe helloWorld.o lanceur.c : puis compilation de lanceur.c , et édition des liens, pour donner helloWorld */ int main() { int retour ; retour = monMain(); return retour; }
Created with colorer-take5 library. Type 'Batch' nasm -f coff helloWorld.asm gcc -o helloWorld.exe helloWorld.o lanceur.c
Created with colorer-take5 library. Type 'asm' ;affCar.asm ;14/04/2008 ;Programme d'exemple d'interfaçage avec le C, pour un exemple d'une fonction C écrite en assembleur. ;Le programme est une fonction affCar. ;Cette fonction utilise une interruption BIOS pour afficher le caractère ;(interruption 10h(fonctions vidéos), fonction 0Eh dans ah, caractère dans al) ; ; Cela peut être aussi un exemple de réalisation en assembleur d'une fonction qu'on ; ne pourrait pas écrire en C( bien sûr si on n'avait pas les librairies du C). ;Début des données segment .data ;Début des données non initialisées segment .bss ;Début du code segment .text global _affCar ; par défaut n'aurait pas été utilisable à l'extérieur! _affCar: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;début vrai code de notre fonction lea ebx, [ebp+8]; mov al, [ebx] mov ah, 0Eh ;permet de préciser quelle fonction de l'interruption 10h on veut: la fonction d'affichage d'un caractère correspond à 0Eh dans ah int 10h ;interruption BIOS pour fonctions vidéos ;fin vrai code de notre fonction popa mov eax, 0 ; on retourne 0 ( ça s'est bien passé) leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret
Created with colorer-take5 library. Type 'c' /* 14/04/2008 Programme d'exemple d'utilisation de la fonction externe affCar, crée par affCar.asm */ #include "affCar.h" int main() { int retour ; retour = affCar('f'); return retour; }
Created with colorer-take5 library. Type 'c' /* 14/04/2008 Auteur: Sabri Koffler */ /* Contient la déclaration du prototype de la fonction externe affCar */ /* Utilisé par affCar.c notamment */ /* Inspiré de stdio.h */ #ifndef AffCar_H /* Seulement si cet include n'a pas déjà été fait */ #define AffCar_H /* Pour savoir que cet include a déjà été fait */ #ifndef _EXFUN /* si pas défini ailleurs( c'est tout à fait possible) */ #define _EXFUN(N,P) N P #endif int _EXFUN( affCar, (char) ); /* Affiche le caractère passé en paramètre. Retourne 0 si pas de pb */ #endif /* AffCar_H */
Created with colorer-take5 library. Type 'Batch' nasm -f coff affCar.asm gcc -o affCar.exe affCar.o affCar-mainC.c
Created with colorer-take5 library. Type 'asm' ;aff.asm ;14/04/2008 ; ;Donné pour la fonction affString, qui est un exemple d'utilisation ;des comparaisons et sauts conditionnels, et de traduction de structure ;de controle à partir du C. ;Contient 2 fonctions C: int affCar( int ); ;et int affString( String ); ; ;Fonction affCar ;Cette fonction utilise une interruption BIOS pour afficher le caractère ;(interruption 10h(fonctions vidéos), fonction 0Eh dans ah, caractère dans al) ; ; Fonction affString ;Cette fonction utilise affCar ;Début des données segment .data ;Début des données non initialisées segment .bss ;Début du code segment .text extern _printf ;FONCTION affCar ;affiche un caractère dans la console ;Un paramètre: le caractère à afficher global _affCar ; par défaut n'aurait pas été utilisable à l'extérieur! _affCar: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;début vrai code de notre fonction lea ebx, [ebp+8]; mov al, [ebx] mov ah, 0Eh ;permet de préciser quelle fonction de l'interruption 10h on veut: la fonction d'affichage d'un caractère correspond à 0Eh dans ah int 10h ;interruption BIOS pour fonctions vidéos ;fin vrai code de notre fonction popa mov eax, 0 ; on retourne 0 ( ça s'est bien passé) leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret ;FONCTION affString ;affiche une string dans la console ;un paramètre: la string à afficher ; ;TRADUIT à partir du code C suivant: ; for (int ebx=adrPhrase; (al=[ebx])!=0; ebx++) ;{ ; affCar([ebx]); ;} ;ce qui revient à faire un while, car le for est un while. ;on aurait pu partir du code C suivant: ;ebx = adresse debut de la chaine ;al = [ebx] ; while (al!=0) ;{ ; affCar([ebx]); ; ebx++; ; al = [ebx]; ;} global _affString ; par défaut n'aurait pas été utilisable à l'extérieur! _affString: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;début vrai code de notre fonction ;appel de _affCar mov ebx, [ebp+8] ; ebx vaut l'adresse de la chaine ; ; mov eax, 0 ;pour pouvoir avoir le caractère dans eax mov al, [ebx] ; on met dans al le caractère courant ;écriture du for (int ebx=adrPhrase; (al=[ebx])!=0; ebx++) debFor: cmp al, 0 ; tant que al !=0 on continue je finFor ; affichage du caractère dans eax push eax ; on passe le caractère à afficher en paramètre call _affCar pop ecx ;on passe au caractère suivant inc ebx mov eax, 0 mov al, [ebx] ; on met dans al le caractère courant jmp short debFor ;fin vrai code de notre fonction finFor: popa mov eax, 0 ; on retourne 0 ( ça s'est bien passé) leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret
Created with colorer-take5 library. Type 'c' /* 15/04/2008 Programme d'exemple d'utilisation de la fonction externe affString, crée par aff.asm */ #include "aff.h" int main() { int retour ; retour = affString("Hello\n"); return retour; }
Created with colorer-take5 library. Type 'Batch' nasm -f coff aff.asm -l aff.txt gcc -o affString.exe aff.o aff-mainC.c
Created with colorer-take5 library. Type 'c' /* 15/04/2008 Auteur: Sabri Koffler */ /* Contient la déclaration du prototype des fonctions externes d'affichage */ /* Inspiré de stdio.h */ #ifndef Aff_H /* Seulement si cet include n'a pas déjà été fait */ #define Aff_H /* Pour savoir que cet include a déjà été fait */ #ifndef _EXFUN /* si pas défini ailleurs( c'est tout à fait possible) */ #define _EXFUN(N,P) N P #endif int _EXFUN( affCar, (char) ); /* Affiche le caractère pas sé en paramètre. Retourne 0 si pas de pb */ int _EXFUN( affString, (char *) ); /* Affiche la string passée en paramètre. Retourne 0 si pas de pb */ #endif /* Aff_H */
Created with colorer-take5 library. Type 'asm' ;Début des données segment .data ;Début des données non initialisées segment .bss ;Début du code segment .text extern _printf ;FONCTION affCar ;affiche un caractère dans la console ;Un paramètre: le caractère à afficher global _affCar ; par défaut n'aurait pas été utilisable à l'extérieur! _affCar: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;début vrai code de notre fonction lea ebx, [ebp+8]; mov al, [ebx] mov ah, 0Eh ;permet de préciser quelle fonction de l'interruption 10h on veut: la fonction d'affichage d'un caractère correspond à 0Eh dans ah int 10h ;interruption BIOS pour fonctions vidéos ;fin vrai code de notre fonction popa mov eax, 0 ; on retourne 0 ( ça s'est bien passé) leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret ;FONCTION affString ;affiche une string dans la console ;un paramètre: la string à afficher ;affichage d'un nombre maximum de caractère, par sécurité ; ;TRADUIT à partir du code C suivant: ;ebx = adresseDeb; ;ecx = longMax; ; for (int ecx=longMax; ((al=[ebx])!=0) && (ecx!=0); ecx--) ;{ ; affCar([al]); ; ebx++; ;} global _affString ; par défaut n'aurait pas été utilisable à l'extérieur! _affString: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha ;début vrai code de notre fonction ;appel de _affCar mov ebx, [ebp+8] ;ebx = adresseDeb; ;ebx vaut l'adresse de la chaine mov ecx, 256 ;ecx = longMax; ;compteur - on affiche 4-1=3 caractères maximum. ecx doit être >=1 ; ; al=[ebx] mov eax, 0 ;pour pouvoir avoir le caractère dans eax mov al, [ebx] ; on met dans al le caractère courant ;On effectue un premier test, car le loopne force à faire au moins un tour de boucle sinon!Or la chaîne peut être vide cmp al, 0 ;(al=[ebx])!=0) ; tant que al !=0 on continue je finFor ; for (int ecx=longMax; ((al=[ebx])!=0) && (ecx!=0); ecx--) debFor: ; affichage du caractère dans eax push eax ; on passe le caractère à afficher en paramètre call _affCar ;affCar([al]); pop edx ; juste pour dépiler le paramètre ;on passe au caractère suivant inc ebx ;ebx++; mov eax, 0 mov al, [ebx] ; on met dans al le caractère courant cmp al, 0 ;(al=[ebx])!=0) loopne debFor ;fin vrai code de notre fonction finFor: popa mov eax, 0 ; on retourne 0 ( ça s'est bien passé) leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret
Created with colorer-take5 library. Type 'c' #include "affString-LoopNE.h" int main() { int retour ; retour = affString("Hello\n"); return retour; }
Created with colorer-take5 library. Type 'c' #ifndef AffStringLoopNE_H /* Seulement si cet include n'a pas déjà été fait */ #define AffStringLoopNE_H /* Pour savoir que cet include a déjà été fait */ #ifndef _EXFUN /* si pas défini ailleurs( c'est tout à fait possible) */ #define _EXFUN(N,P) N P #endif int _EXFUN( affCar, (char) ); /* Affiche le caractère passé en paramètre. Retourne 0 si pas de pb */ int _EXFUN( affString, (char *) ); /* Affiche la string passée en paramètre. Retourne 0 si pas de pb */ #endif /* Aff_H */
Created with colorer-take5 library. Type 'Batch' nasm -f coff affString-LoopNE.asm -l affString-LoopNE.txt gcc -o affString-LoopNE.exe affString-LoopNE.o affStringLoopNE-mainC.c
Created with colorer-take5 library. Type 'asm' push ebp mov ebp, esp sub esp, 4 ; 4 dans l’exemple d’une seule variable locale, de type int
Created with colorer-take5 library. Type 'asm' mov esp, ebp pop ebp
Created with colorer-take5 library. Type 'asm' %define res ebp-4 ;Début des données segment .data ;Début des données non initialisées segment .bss ;Début du code segment .text ;FONCTION soustr ;Effectue une soustraction de deux entiers signés ;Deux paramètres: a et b, deux int signés. Effectue a-b global _soustr _soustr: enter 4,0 ; une variable locale: le résultat pusha ;début vrai code de notre fonction mov ebx, [ebp+8] sub ebx, [ebp+12] mov [res], ebx ;fin vrai code de notre fonction popa mov eax, [res] ; on retourne la valeur de la variable locale resultat. Pas oublier ;qu'un popa a eu lieu avant, donc tous les registres ;peuvent avoir été modifiés leave ret
Created with colorer-take5 library. Type 'c' #include <stdio.h> int soustr( int, int); int main() { int a, b, retour; a=-100000; b=50001; retour = soustr(a,b); printf( "Le resultat de a-b est %d", retour); /* Affiche -150001 */ return 0; }
Created with colorer-take5 library. Type 'Batch' nasm -f coff soustr.asm -l soustr.txt gcc -o soustr.exe soustr.o soustr-mainC.c
Created with colorer-take5 library. Type 'asm' ; affPI.asm ; affPI, version 1.0 . 24/04/2008. ;Auteur: sabri koffler, 24/04/2008, pour infkoffler.com. ; Affiche la valeur du nombre PI, en double précision. ;Exemple d'utilisation du coprocesseur arithmétique ; ; à l'exécution, on remarque que les 16 chiffres significatifs sont exacts, et ;correspondent à la valeur exacte de pi qui est 3,141 592 653 589 793 ( 238...) segment .data formatResult: db "La valeur de Pi est : %.15f", 0 ;%f pour afficher un flottant en double précision ;.15: 15 chiffres après la virgules, peut importe devant ;Début des données non initialisées segment .bss piFloat: resq 1 ;Début du code segment .text extern _printf ;pour le programme assembleur, on déclare explicitement que _printf existe ailleurs global _affPIMain ; par défaut n'aurait pas été utilisable à l'extérieur, donc on doit le mettre! _affPIMain: enter 0,0 ;effectue PUSH EBP puis MOV EBP, ESP pusha pushf ;début vrai code de notre fonction fldpi ;ST0 = PI fst qword [ piFloat ] ;Affichage de PI ; ;on met d'abord les 32 bits dans ax-bx mov esi, piFloat ;on empile d'abord le deuxième paramètre de printf, qui est de 64 bits( double précision) push dword [ esi+4 ] ;on empile d'abord les 4 derniers octets du flottant 64 bits push dword [ esi ] ;puis les 4 premiers octets ( cet ordre est indispensable à respecter) ;ainsi, en les dépilant, la fonction les récupère dans l'ordre où ils étaient écrits en mémoire ; ;puis on empile le premier paramètre de printf push formatResult call _printf pop ecx pop ecx pop ecx ;fin vrai code de notre fonction popf popa mov eax, 0 ; on peut mettre 0 si pas de valeur de retour leave ;fin du enter 0,0 du début : effectue MOV ESP, EBP puis POP EBP ret
Created with colorer-take5 library. Type 'c' /* affPIMain.c */ /*Auteur Sabri Koffler 24/04/2008 pour infkoffler*/ /*Version 1.0 24/04/2008*/ int main() { affPIMain(); return 0; }
Created with colorer-take5 library. Type 'Batch' nasm -f coff affPI.asm -l affPI.txt gcc -o affPI.exe affPI.o affPIMain.c