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

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

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

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

См. Также ссылки в встроенная сборка тегов вики, чтобы узнать, как это сделать правильно. Это сложно, и лучший вариант - gcc.gnu.org/wiki/DontUseInlineAsm. Для повышения производительности по возможности изменяйте исходный код, чтобы компилятор мог улучшить код, вместо использования встроенного asm. (например, посмотрев на вывод asm компилятора, чтобы увидеть, что он не может оптимизировать или что он делает неправильно.)

Peter Cordes 27.10.2017 11:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
67
1
79 512
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

stukelly 14.09.2008 18:20

Компилятор VS не поддерживает встроенную сборку! Пытаясь сделать это несколько лет назад, я обжег себе палец!

Jay D 02.05.2012 11:04

@JayD: компилятор VS поддерживает встроенную сборку в зависимости от цели. Например, поддерживается 32-битный x86; 64-битной x86-64 нет.

Michael Burr 02.05.2012 11:11

Да, это допустимый синтаксис 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

Peter Cordes 03.04.2019 17:10

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

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

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

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

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

Майк, что вы имеете в виду под «компиляторами Microsoft, отличными от x86, не поддерживают встроенную сборку»? Конечно, вы можете, например, Встроенная сборка ARM (не x86), просто найдите ее.

34563578345 21.09.2017 12:56

«Встроенная сборка не поддерживается на процессорах ARM и x64». - docs.microsoft.com/en-gb/cpp/assembler/inline/inline-assembl‌er. Ассемблер В соответствии означает использование блоков __asm, и я говорю конкретно о компиляторах Microsoft. Вы по-прежнему можете создать отдельный файл .asm, собрать его с помощью ассемблера Microsoft (ML / ML64 / armasm) и связать полученный .obj с программой C / C++ с помощью CL. Другие ответы показывают, что вы можете выполнять встроенную сборку с другими компиляторами.

Mike Dimmick 21.09.2017 19:58

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