85 votes

Existe-t-il un moyen d'insérer du code assembleur dans le langage C ?

Je me souviens qu'à l'époque, avec le vieux compilateur DOS de Borland, on pouvait faire quelque chose comme ça :

asm {
 mov ax,ex
 etc etc...
}

Existe-t-il un moyen semi-indépendant de la plate-forme pour faire cela maintenant ? J'ai besoin de faire un appel au BIOS, donc s'il y avait un moyen de le faire sans code asm, ce serait tout aussi utile pour moi.

87voto

Niall Points 2074

Utilisation CCG

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

Utilisation VC++

__asm {
  mov eax, edx
  add eax, 2
}

20voto

Dans le CCG, il y a plus que cela. Dans l'instruction, il faut dire au compilateur ce qui a changé, pour que son optimiseur ne se plante pas. Je ne suis pas un expert, mais parfois cela ressemble à quelque chose comme ça :

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

Il est conseillé d'écrire un exemple de code en C, de demander à GCC de produire une liste d'assemblage, puis de modifier ce code.

10voto

Espo Points 24318

Un bon début serait de lire cet article qui parle de l'assemblage en ligne en C/C++ :

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

Exemple tiré de l'article :

#include <stdio.h>

int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}

3voto

Mike Dimmick Points 6112

Pour les compilateurs Microsoft, en ligne n'est pris en charge que pour x86. Pour les autres cibles, vous devez définir la fonction entière dans un fichier source d'assemblage séparé, le transmettre à un assembleur et lier le module objet résultant.

Il est très peu probable que vous puissiez accéder au BIOS sous un système d'exploitation en mode protégé et vous devez utiliser les fonctions disponibles sur ce système. Même si vous êtes en mode noyau, ce n'est probablement pas sûr - le BIOS peut ne pas être correctement synchronisé par rapport à l'état du système d'exploitation si vous le faites.

1voto

L'utilisation de asm o __asm__ fonction (dans les compilateurs, il y a une différence)

Vous pouvez également écrire des codes fortran avec fortran fonction

asm("syscall");
fortran("Print *,"J");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X