Есть ли способ вставить ассемблерный код в C?
-
09-06-2019 - |
Вопрос
Я помню, когда-то со старым компилятором borland DOS вы могли бы сделать что-то вроде этого:
asm {
mov ax,ex
etc etc...
}
Есть ли полуплатформенно независимый способ сделать это сейчас?Мне нужно выполнить вызов BIOS, поэтому, если бы был способ сделать это без asm-кода, это было бы одинаково полезно для меня.
Другие советы
В 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 может быть некорректно синхронизирован относительно состояния операционной системы, если вы это сделаете.