Interfacer du code assembleur et du C


Interfacer du code assembleur et du C




Introduction


Si, à tout hasard, vous souhaitez utiliser du code assembleur dans votre code C, ou encore utiliser une fonction d'une librairie externe depuis l'assembleur, eh bien c'est tout à fait possible et il y a des solutions plus confortables que d'autres pour faire ça.
Je préviens tout de suite que ce sujet n'est pas un cours d'assembleur!
De même je fais référence à des notions de convention de passage de paramètres sous x86, enfin... juste cdecl et stdcall.

Appeler du code assembleur écrit dans un fichier source externe


Avec Nasm (x86 uniquement)


Imaginons que vous ayez un fichier source comme celui-ci appelé test.c:
void additionne(int nb);

int main()
{
	int i;
	for(i=0; i<10; i++)
	{
		additionne (i);
	}
	return 0;
}


Votre fonction additionne n'est pas définie et vous voudriez qu'elle le soit en assembleur.
On va donc l'écrire dans un fichier externe pour pouvoir la compiler avec nasm.
Cette fonction additionne va en fait faire une addition cumulée et l'afficher au fur et à mesure.
C'est à dire que
additionne(2) donnera 2
puis encore additionne(2) donnera 4 etc...
Je fais ça pour pouvoir vous montrer comment déclarer une variable globale avec nasm et comment appeler une fonction externe comme printf depuis l'assembleur.

On crée un fichier appelé add.asm.
Du début à la fin on aura

_La référence aux fonctions externes:
;Permet de faire appel à printf
externe printf


_ La section de données:
section .data
        ;La chaîne passée à printf pour afficher notre addition cumulée (0xa = saut de ligne)
	msg db 'Addition cumulée: %d',0xa, 0 
        ;La variable qui mémorisera l'addition cumulée. Elle est égale à 0 au début
	addition_cumulée dw 0 


_ Le code:

section .text
        ;On rend visible notre fonction additionne pour les fichiers externes
	global additionne 

;Fonction en convention cdecl
additionne:
	push ebp
	mov  ebp, esp
	push ecx

	mov ecx, [addition_cumulée]
	add ecx, [ebp + 8]     ; On fait notre addition:  nb + addition_cumulée
	mov [addition_cumulee], ecx    ; On met à jour addition_cumulée = addition_cumulée + nb
	push ecx
	push msg
	call printf     ; Équivalent de printf(msg, ecx). C'est un appel de type cdecl.
	add esp, 8

	pop ecx
	leave
	ret


A présent on va compiler le tout.

Compilation/Exécution sous Linux


On compile notre fichier asm:
nasm -f elf add.asm

On compile test.c et on le met en lien avec notre fichier assembleur compilé:
gcc test.c add.o -o test


Et on teste:
./test
Addition cumulée: 0
Addition cumulée: 1
Addition cumulée: 3
Addition cumulée: 6
Addition cumulée: 10
Addition cumulée: 15
Addition cumulée: 21
Addition cumulée: 28
Addition cumulée: 36
Addition cumulée: 45

Avec Gcc (multiplateforme)


(à faire)
Publié par kilian - Dernière mise à jour le 17 novembre 2009 à 16:35 par Helper-Mask
Ce document intitulé « Interfacer du code assembleur et du C » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Suggestions
  •  Interfacer du code assembleur et du C
  •  Exercice assembleur x86 inversion de chaîne » Fiches pratiques : Introduction Notions abordées dans cet exercice Énoncé Rappel Indices Corrigé Explication Introduction Ce petit exercice d'assembleur vise les architectures x86 (Processeurs Intel et Amd 32 bits) et utilise la syntaxe de Nasm, un...
  •  Liens utiles assembleur x86 » Fiches pratiques : Voici quelques liens utiles pour l'assembleur x86. Le but étant de compiler des documents pertinents autant pour ceux qui débutent que pour ceux qui sont à l'aise dans ce domaine. Tutoriels Références complètes Assembleur sous...
  •  Instructions arithmétiques et logiques en assembleur » Articles : Les instructions arithmétiques et logiques sont effectuées par l'unité arithmétique et logique. Il s'agit d'opérations directement effectuées sur les bits de la donnée que l'on traite. Sont comprises dans cette appellation : les instructions...
  •  Télécharger calcul de prêt » Télécharger : Calcul de prêt est un logiciel Freeware qui permet de calculer les caractéristiques d'un prêt ou d'un emprunt. L'application est capable de déduire pour vous différentes inconnues, selon les données en votre possession. Calcul de prêt vous donnera le...
  •  Comment faire une interface ? (Résolu) » Meilleure réponse: pour faire une interface comme celle "lyoko-interface.net", moi, j'ai utilisé la chose la plus simple qu'il soit, un diaporama, si tu veux de plus emple information, jeune débutant, ajoute mon adresse msn dans tes contacts et je t'expli
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?