Passer un tableau C à un programme ASM

Résolu/Fermé
Stratosphr - Modifié par Stratosphr le 20/04/2011 à 22:05
 Stratosphr - 21 avril 2011 à 12:48
Bonjour, je dispose de deux fichiers, un fichier "fich.c" et un fichier "fich.asm".
Mon code C fait appel à une fonction présente dans mon programme Assembleur. Jusqu'ici, pas de problème.
J'aimerais à présent envoyer un tableau de char à cette fonction.
Apparemment, j'arrive à l'envoyer, mais je voudrais savoir comment faire en Assembleur pour récupérer la valeur de tab[0], tab[1], tab[2], etc.
Je donne un exemple :
fich.c :
int main(){
char tab[3]={'a', 'b', 'c'};
func_asm(tab) //Appel à la fonction
return 0;
}
fich.asm :
segment .text:
global func_asm
func_asm:
//Stocker la valeur de tab[2] dans le registre eax

Que dois-je mettre dans la fonction func_asm ???
Merci d'avance pour votre aide :)

1 réponse

Bonjour

Ça dépend de ton assembleur et de ton C. Mais il y a un truc simple : tu écris ta fonction func_asm en C et tu utilises l'option du compilateur pour voir le code assembleur généré. Tous le compilateurs que j'ai utilisés avaient cette option (faut lire la doc pour la trouver, du côté des options du listing généré par la compilation).

Tu verras très probablement qu'il récupère l'adresse de base du tableau dans la pile, puis qu'il ajoute 3, puis qu'il lit un octet par adressage indirect.

Mais difficile d'être plus précis pour celui qui n'a pas ton compilateur
0
D'accord merci beaucoup. Je tourne sous linux et j'utilise la commande "nasm" pour compiler mon fichier ASM, puis "gcc" pour compiler mon fichier C et lier mes fichiers objet. Je vais voir ce que cela donne :). Petite question, pourquoi ajouterait-il 3 et pas un autre nombre ? Il doit y avoir quelque-chose qui m'échappe...
Merci encore :)
0
Pourquoi 3 ? Parce que je mes suis trompé. Pour récupérer tab[2], tab étant un tableau de char, il faut ajouter 2 et non pas 3 à l'adresse de tab. C'était pour voir si tu suivais (même pas honte)
0
C'est compris :) Un char est codé sur 1 octet.
Ainsi :
pour tab[0] : +0 octet
pour tab[1]: +1 octet
pour tab[2]: +2 octets
C'est ça ? Merci beaucoup pour ton aide :)
0
C'est ça, dans la mesure où un char occupe 1 octet. Avec un tableau d'int, il aurait fallu ajouter 4 (si entiers sur 2 octets) ou 8 (si entiers sur 4 octets). Pour connaître la taille occupée par une variable, lis la doc de ton compilateur ou utilise la fonction sizeof(type_a_tester)
0
Merci ! Je connaissais cette fonction :) Bonne journée à toi merci d'avoir passé du temps sur la question :)
0