Я помню, что когда-то со старым компилятором Borland DOS можно было делать что-то вроде этого:
asm {
mov ax,ex
etc etc...
}
Есть ли сейчас полуплатформенный независимый способ сделать это? Мне нужно сделать вызов BIOS, поэтому, если бы был способ сделать это без asm-кода, это было бы мне одинаково полезно.





Хорошим началом было бы чтение этой статьи, в которой рассказывается о встроенной сборке на 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 , %eax;"
"movl , %ebx;"
"addl %ebx, %eax;"
);
/* Subtract 20 from 10 and store result into register %eax */
__asm__ ( "movl , %eax;"
"movl , %ebx;"
"subl %ebx, %eax;"
);
/* Multiply 10 and 20 and store result into register %eax */
__asm__ ( "movl , %eax;"
"movl , %ebx;"
"imull %ebx, %eax;"
);
return 0 ;
}
Использование GCC
__asm__("movl %edx, %eax\n\t"
"addl , %eax\n\t");
Использование VC++
__asm {
mov eax, edx
add eax, 2
}
C++ Builder от CodeGear также поддерживает ключевое слово __asm.
Компилятор VS не поддерживает встроенную сборку! Пытаясь сделать это несколько лет назад, я обжег себе палец!
@JayD: компилятор VS поддерживает встроенную сборку в зависимости от цели. Например, поддерживается 32-битный x86; 64-битной x86-64 нет.
Да, это допустимый синтаксис gcc, но с ошибками, если вы не поместите его в функцию с __attribute__((naked)), которая содержит встроенный asm Только. Если вы изменяете регистры, вы должен используете ограничения / клобберы GNU C Extended Asm, чтобы сообщить об этом компилятору.; наступление на регистры компилятора может привести к действительно странным результатам. (Тестирование одного случая с отключенной оптимизацией тоже не доказывает, что это безопасно). См. gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.ht мл / stackoverflow.com/tags/inline-assembly/info / ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
В GCC есть еще кое-что. В инструкции вы должны сообщить компилятору, что изменилось, чтобы его оптимизатор не облажался. Я не эксперт, но иногда это выглядит примерно так:
asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");
Рекомендуется написать пример кода на C, затем попросить GCC создать листинг сборки, а затем изменить этот код.
Для компиляторов Microsoft сборка в соответствии поддерживается только для x86. Для других целей вы должны определить всю функцию в отдельном исходном файле сборки, передать его ассемблеру и связать полученный объектный модуль.
Маловероятно, что вы сможете вызвать BIOS в операционной системе с защищенным режимом, и вам следует использовать все возможности, доступные в этой системе. Даже если вы находитесь в режиме ядра, это, вероятно, небезопасно - BIOS может быть неправильно синхронизирован относительно состояния ОС, если вы это сделаете.
Майк, что вы имеете в виду под «компиляторами Microsoft, отличными от x86, не поддерживают встроенную сборку»? Конечно, вы можете, например, Встроенная сборка ARM (не x86), просто найдите ее.
«Встроенная сборка не поддерживается на процессорах ARM и x64». - docs.microsoft.com/en-gb/cpp/assembler/inline/inline-assembler. Ассемблер В соответствии означает использование блоков __asm, и я говорю конкретно о компиляторах Microsoft. Вы по-прежнему можете создать отдельный файл .asm, собрать его с помощью ассемблера Microsoft (ML / ML64 / armasm) и связать полученный .obj с программой C / C++ с помощью CL. Другие ответы показывают, что вы можете выполнять встроенную сборку с другими компиляторами.
См. Также ссылки в встроенная сборка тегов вики, чтобы узнать, как это сделать правильно. Это сложно, и лучший вариант - gcc.gnu.org/wiki/DontUseInlineAsm. Для повышения производительности по возможности изменяйте исходный код, чтобы компилятор мог улучшить код, вместо использования встроенного asm. (например, посмотрев на вывод asm компилятора, чтобы увидеть, что он не может оптимизировать или что он делает неправильно.)