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
Enregistrer un commentaire