Есть ли способ вставить ассемблерный код в C?

StackOverflow https://stackoverflow.com/questions/61341

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Используя ССАГПЗ

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

Используя VC++

__asm {
  mov eax, edx
  add eax, 2
}

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top