IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

syntaxe at&t et intel


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut syntaxe at&t et intel
    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

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    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*/
    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
    Le même mais avec un passage par référence :
    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

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    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??

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    Oui, en passant l'adresse du tableau à la routine ASM (passage par référence).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 30
    Points : 11
    Points
    11
    Par défaut
    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:
    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");
    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.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    re,
    merciii,et pour lier le fichier asm il faut écrire $ cat exemple.asm?

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    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

Discussions similaires

  1. Syntaxe Intel ou AT&T sous Mac OS X
    Par buzorg dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 18/04/2009, 18h33
  2. [Syntaxe] Traduction AT&T vers intel
    Par Invité dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 21/03/2009, 10h42
  3. Réponses: 10
    Dernier message: 22/05/2008, 12h29
  4. Différence syntaxe AT&T/Intel
    Par MysticKhal_0 dans le forum Assembleur
    Réponses: 2
    Dernier message: 08/06/2005, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo