Есть ли способ вставить ассемблерный код в C? - PullRequest
53 голосов
/ 14 сентября 2008

Я помню, как когда-то со старым DOS-компилятором borland вы могли сделать что-то вроде этого:

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

Есть ли полуплатформенный независимый способ сделать это сейчас? Мне нужно сделать вызов BIOS, поэтому, если бы был способ сделать это без кода asm, это было бы одинаково полезно для меня.

Ответы [ 4 ]

61 голосов
/ 14 сентября 2008

Использование GCC

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

Использование VC ++

__asm {
  mov eax, edx
  add eax, 2
}
12 голосов
/ 15 сентября 2008

В GCC есть нечто большее, чем это. В инструкции вы должны сообщить компилятору, что изменилось, чтобы его оптимизатор не испортился. Я не эксперт, но иногда это выглядит примерно так:

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

Это хорошая идея написать пример кода на C, затем попросить GCC создать листинг сборки, а затем изменить этот код.

5 голосов
/ 14 сентября 2008

Хорошим началом будет чтение этой статьи, в которой рассказывается о встроенной сборке в C / C ++:

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

Пример из статьи:

#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 ;
}
3 голосов
/ 15 сентября 2008

Компиляторы Microsoft, отличные от x86, не поддерживают встроенную сборку. Вы должны определить всю функцию в отдельном исходном файле сборки и передать ее ассемблеру.

Вы вряд ли сможете заходить в BIOS в операционной системе с защищенным режимом, и вам следует использовать все имеющиеся в этой системе средства. Даже если вы находитесь в режиме ядра, это, вероятно, небезопасно - BIOS может быть неправильно синхронизирован относительно состояния ОС, если вы это сделаете.

...