Asm inline avec gcc en syntaxe intel

0/5 (3 avis)

Vue 18 580 fois - Téléchargée 358 fois

Description

Il est parfois indispensable d'utiliser de l'asm quand oN programme en C, par exemple pour optimiser un programme, ou lorsque que l'on utilise des instructions que on n'a pas en C (exemple : int)
Seulement avec gcc (compilateur de dev-cpp) ce n'est pas chose facile, car la syntaxe est de type at&t, une sorte de mandarin (chinoi) pour ceux qui connaissent déjà la syntaxe intel (celle de nasm, masm...)
Mon code propose 2 méthodes pour palier à ce problème : la premiere est une astuce pour utiliser la syntaxe INTEL sous gcc, la seconde est un mini-dictionnaire qui regroupe quelques traductions de la syntaxe intel vers la syntaxe gcc.
Ce code s'adresse aux débutant qui ont dev-cpp, ou au personne sous LINUX !

Source / Exemple :


/*

  • This program is free software; you can redistribute it and/or modify
  • it under the terms of the GNU General Public License as published by
  • the Free Software Foundation; either version 2 of the License, or
  • (at your option) any later version.
*
  • This program is distributed in the hope that it will be useful,
  • but WITHOUT ANY WARRANTY; without even the implied warranty of
  • MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  • GNU General Public License for more details.
*
  • You should have received a copy of the GNU General Public License
  • along with this program; if not, write to the Free Software
  • Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  • /
/*
  • Conversion de la syntaxe at&t vers celle de intel (idem que nasm par exemple)
  • Sous liscence GNU/GPL...blablabla...(par vinc1008881, vinc(pnt)calo~one( arob )wan~adoo.france)
  • !!!!!!!!!!!POUR QUE GCC RESPECTE STRICTEMENT LA COMMANDE ASM ORDONNE, IL FAUT
  • METTRE asm volatile ("instruction"); et non asm ("instruction");
  • /
//1)syntaxe intel avec gcc : ATTENTION NE MARCHE QU'AVEC DES VARIABLES GLOBALES !!! void un (void) //ne PAS compiler ce programme { int var = 13; asm (".intel_syntax noprefix");//passage en syntaxe intel asm ("mov ax, 0x3");//instruction en syntaxe intel asm ("mov eax, [var]");//l'edition des liens sera mauvaise car var est une variable LOCALE asm (".att_syntax noprefix");//passage en syntaxe at&t } //2)syntaxe at&t avec gcc : possibilité d'inclure des variables locales //comme cette syntaxe est imcompréhensible, voilà un dico de intel vers gcc :-) //entre ( ) dans les lignes asm suivantes se trouve le nom de la variable locale --> ne pas enlever les parentheses //bien sur je ne traite pas tous les cas : a vous d'adapter pour vos besoin (ex : charger eax en ebx...) void deux (void) { char ca, cb, cc;//variables locales pour les exemples short sa, sb, sc; int ia, ib, ic; asm("cli" ::); //cli asm("hlt" ::); //hlt asm("inb %w1, %b0" : "=a"(ca) : "d"(sa)); //mov dx, [sa] in al, dx mov [ca] asm("int $0x10");//int 0x10 asm("jmp label");//jmp label --> idem pour tous les jxx asm("label:");//label: asm("lgdt %0" : : "m" (ia));//lgdt [ptr] /!\ ici ia est une structure de 6 octets asm("lidt %0" : : "m" (ia));//lidt [ptr] /!\ ici ia est une structure de 6 octets asm("mov %0, %%eax" :: "r" (ia));//mov eax, [ia] asm("mov %%eax, %0" : "=r" (ia));//mov [ia], eax asm("mov %ax, %ds");//mov ds, ax asm("mov %eax, %ebx");//mov ebx, eax asm("mov $next, %eax");//mov eax, next asm("next:"); asm ("nop" ::); //nop asm("outb %%al, %%dx" : : "d" (sa), "a" (ca));//mov al, [ca] mov dx, [sa] out al, dx asm("outw %%ax, %%dx" : : "d" (sa), "a" (sb));//mov ax, [sb] mov dx, [sa] out ax, dx asm("popf"); //popf asm("popfl"); //popfd asm("popl %ebp"); //pop ebp asm("popw %ax"); //pop ax asm("pushf"); //pushf asm("pushf"); //pushfd asm("pushl %ebp"); //push ebp asm("pushw %ax"); //push ax asm("rdtsc" : "=A" (ia));//rdtsc puis place le contenue de eax et ebx dans ia ICI unsigned long long de 64 bits asm("sgdt %0" : "=m" (ia));//sgdt [ia] attention ia structure de 6 octets asm("sidt %0" : "=m" (ia));//sidt [ia] attention ia structure de 6 octets asm("sti" ::); //sti }

Conclusion :


Il y a seulement les instructions fondamentales (mov, push, int) et ceux systeme (lgdt, cli...), les autres viendrons au fil du temps.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
2 sept. 2007 à 18:36
salut

moi l'asm inline at&t je l'utilises uniquement comme ça
pour utiliser un nom déclaré en C dans de l'asm les noms sont précédés par un _
mais comme l'asm est assemblé après la compilation, et qu'à la compilation les variables locales sont dans la pile ou les registres (et leur nom disparait), on ne peut utiliser que les variables globales (c'est logique et ça n'a pas spécialement de raison d'être autrement)
de la même manière on ne peut pas utiliser des noms en C qui ont été déclarés en asm sauf si en C on les déclare externe avant ou si on déclare le prototype pour une fonction

#include <stdio.h>
#include <stdio.h>
int eaxRes;

void mafonction2();
void mafonction() {
printf("ma fonction\n");
}

asm("_mafonction2:");
asm("ret");

int main() {
asm("movl $0x123, %eax");
asm("movl %eax, _eaxRes");

printf("%x\n",eaxRes); // affiche 123 (hexa)

asm("movl $123, %eax");
asm("movl %eax, _eaxRes");

printf("%d\n",eaxRes); // affiche 123

eaxRes = 122;
asm("movl _eaxRes, %eax");
asm("addl $1, %eax");
asm("movl %eax, _eaxRes");
printf("%d\n",eaxRes); // affiche 123

asm("call _mafonction"); // affiche ma fonction

mafonction2();
return 0;
}
jb_gfx Messages postés 8 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 16 octobre 2006
16 oct. 2006 à 08:20
Je sais toujours pas comment récupérer le contenu d'un registre dans une variable C. Si tu peux m'expliquer... merci

Par exemple:
eax=0x02B et j'ai ma variable C: int eaxRes;
Comment je place 0x02B dans eaxRes à la fin de ma routine asm?
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
3 août 2006 à 13:49
Dans le même genre et pour avoir de l'asm x86 dans gdb, çà peut servir : set disassembly-flavor intel

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.