Есть ли способ вставить код сборки в C?

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

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

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

Ответ 1

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

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

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

__asm {
  mov eax, edx
  add eax, 2
}

Ответ 2

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

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

Хорошая идея написать пример кода в C, затем попросить GCC создать список сборок, а затем изменить этот код.

Ответ 3

Хорошим началом будет чтение этой статьи, в которой рассказывается о встроенной сборке в 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 ;
}

Ответ 4

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

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