Comment modifier la convention d'appel gcc

Salut, je voudrais dire à gcc comment appeler des fonctions, par exemple:

 __mycall void my_function(arg1) {
do_something(arg1)
}

 __mycall:
move $a0, (the first argument)
jalr (the function we should call)
nop

Je voudrais le code assembleur généré de:


my_function(1);

Être


move $a0, 1
jalr my_function
nop

Je ne veux évidemment pas implémenter stdcall ou fastcall ou quelque chose comme ça, je viens d'expliquer par un exemple.

Je ne pense pas que cela devrait être difficile à faire, mais je ne trouve aucun exemple sur la façon de le faire. Je peux écrire un assemblage en ligne et appeler ma fonction avec un assemblage en ligne, mais c'est moche, j'apprécierai l'aide (:


Solution du problème

Vous pouvez utiliser l'attribut de fonction fastcall ou thiscall (x86-32)

Sur les cibles x86-32, l'attribut fastcall oblige le compilateur à passer le premier argument (s'il est de type intégral) dans le registre ECX et le deuxième argument (s'il est de type intégral) dans le registre EDX. Les arguments suivants et autres arguments typés sont passés sur la pile. La fonction appelée extrait les arguments de la pile. Si le nombre d'arguments est variable, tous les arguments sont poussés sur la pile.

Sur les cibles x86-32, l'attribut thiscall force le compilateur à passer le premier argument (s'il est de type intégral) dans le registre ECX. Les arguments suivants et autres arguments typés sont passés sur la pile. La fonction appelée extrait les arguments de la pile. Si le nombre d'arguments est variable, tous les arguments sont poussés sur la pile. L'attribut thiscall est destiné aux fonctions membres non statiques C++. En tant qu'extension GCC, cette convention d'appel peut être utilisée pour les fonctions C et pour les méthodes membres statiques.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"