bonjour,
je voudrais savoir si pour inclure de l'asm dans un code c il faut impérativement qu'on utilise le syntaxe at&t ? si oui comment convertir du syntaxe intel à AT&T?? (j'utilise code blocks comme compilateur) merci
bonjour,
je voudrais savoir si pour inclure de l'asm dans un code c il faut impérativement qu'on utilise le syntaxe at&t ? si oui comment convertir du syntaxe intel à AT&T?? (j'utilise code blocks comme compilateur) merci
Cela dépend si le compilateur permet le code d'assemblage inline. Ensuite, la façon de l'inclure diffère selon le compilateur utilisé (Microsoft C, TurboC, etc.).
Une méthode plus souple est de lier une routine assembleur au programme en C.
Cinq points sont à respecter.
o Les paramètres se passent sur la pile dans le sens inverse de leur déclaration. S'il s'agit d'un passage par valeur, le résultat sera dans AX (2 octets) ou DX:AX (4 octets). S'il s'agit d'un passage par référence, le résultat est stocké à l'emplacement pointé par le paramètre.
o La procédure est déclarée PUBLIC dans son fichier source et son nom est généralement précédé par un trait de soulignement (_).
o Si le programme C fait usage d'un seul segment de code, il appellera une procédure proche (NEAR au lieu de FAR).
o Les mêmes noms de segments doivent être employés. Ainsi, les derniers compilateurs C de Microsoft pour DOS emploient les désignations suivantes :
- _TEXT pour le code ;
- _DATA pour les données ;
- DGROUP pour les données incluant la pile ;
- _BBS pour les données initialisées à l'exécution ;
- etc.
o Les registres non préservés par le compilateur C lors de l'appel d'une procédure externe doivent être sauvegardés avant usage puis restitués. Dans le cas du Microsoft C, ce sont les suivants : DS, SS, BP, SI et DI.
Voici un exemple d'appel (tiré du Guide Peter Norton du programmeur sur PC & PS) avec passage par valeur dans un modèle de mémoire à segment de code unique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ; dans le programme C x = AbsValeur (y); /*x et y sont entiers*/Le même mais avec un passage par référence :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 ; dans le fichier source ASM _TEXT SEGMENT byte public 'CODE' ASSUME cs:_TEXT PUBLIC _Absvaleur _AbsValeur PROC near ; appel avec CALL proche push bp mov bp,sp mov ax,[bp+4] ; AX = valeur du 1er ; paramètre cwd xor ax,dx sub ax,dx ; laisse le résultat dans AX pop bp ; RETour proche ret _AbsValeur ENDP _TEXT ENDS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ; dans le programme C SmallAbs ( &x ); /*passe l'adresse de x*/
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 ; dans le fichier source ASM _TEXT SEGMENT byte public 'CODE' ASSUME cs:_TEXT PUBLIC _SmallAbs _SmallAbs PROC near ; appel avec CALL proche push bp mov bp,sp mov bx,[bp+4] ; BX = adresse du 1er ; paramètre mov ax,[bx] ; AX = valeur du 1er ; paramètre cwd xor ax,dx sub ax,dx mov [bx],ax ; laisse le résultat à ; l'adresse du paramètre pop bp ret _SmallAbs ENDP _TEXT ENDS
re,
et si j'utilise des parametres déclarés dans le programme c tel qu'un tableau ou entier,dans le fichier asm,est ce qu'ils sont reconnus??
Oui, en passant l'adresse du tableau à la routine ASM (passage par référence).
Tu peux mettre du code asm intel drect dans le code en c. Il faut cependant écrire une ligne qui indique la traduction et respecter quelques règles:
en gros, a chaque variable global de ton programme en C, ajoute "_" devant. Ici, a était une variable global. Essayer sur codeblocks avec gcc et ca marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 asm (".intel_syntax noprefix"); asm ("mov eax,_a"); asm ("..."); asm (".att_syntax noprefix");
re,
merciii,et pour lier le fichier asm il faut écrire $ cat exemple.asm?
merci Foelthanos mais le probleme avec asm("instr") c'est que j'ai plusieurs instruction et je veux utiliser le resultat donc j'ai fait un if qui englobe tout les asm("") mais ça marche pas,si vous avez une autre methode pour tirer profit du resultat je serais reconnaissant
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager