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

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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

Le shell POSIX (sh) redirige stderr vers stdout et capture stderr et stdout dans des variables