Описание тега inline-assembly
Встроенная сборка используется в языке более высокого уровня для обеспечения доступа к функциям, не предоставляемым встроенными функциями. c и C++ - наиболее распространенные языки "хоста", которые позволяют использовать встроенный asm.
Не используйте встроенный asm, не осознавая потенциальных недостатков производительности, а также очевидных недостатков ремонтопригодности / переносимости. Компилятор не может понять встроенный asm для распространения констант и других оптимизаций. Если вы можете заставить компилятор генерировать эквивалентный asm из обычного исходного кода без встроенного asm, это почти всегда предпочтительнее.
Ресурсы
- https://gcc.gnu.org/wiki/DontUseInlineAsm. Нулевой шаг при использовании встроенного asm - это вообще попытка избежать необходимости в нем.
- Встроенная сборка Visual C++
- HOWTO по встроенной сборке GCC, выпущенный в2003 году, но все еще правильный и полезный.
- Официальные документы встроенного asm GNU C
- Еще один более свежий учебник GNU C
- Хорошее пошаговое объяснение для новичков использования правильных ограничений для входных и выходных операндов для (
idiv
). Другой ответ на этот вопрос также объясняет, когда и почему использовать Early-clobber.&
в выходных операндах. - Основы использования входов / выходов "r" и "=r" или операнда входа / выхода "+r". Некоторые сведения о том, как встроенный синтаксис asm GNU C требует, чтобы операнды описывали шаблон для компилятора.
- Использование манекена
"m"
или"=m"
операнды, чтобы сообщить компилятору, какую память вы читаете / записываете с помощью указателей, которые вы запрашивали в"r"
операнды, вместо использования"memory"
тупица:- Как я могу указать, что можно использовать память, на которую * указывает * встроенный аргумент ASM?
- простой strlen (сообщающий компилятору, что на весь блок памяти ссылаются без явной длины, используя фиктивный
struct
с гибким элементом массива). - Цикл по массивам с помощью встроенной сборки (достоинства
"m"
vs."r"
ограничения)
- Коллекция встроенных asm-ссылок GNU C в нижней части этого ответа (руководства / советы / информация)
- Встроенный asm MSVC против встроенного asm GNU C для упаковки одной инструкции
X86 тега вика имеет массу хороших вещей для этой архитектуры, и сборка тегов вики также имеют несколько ссылок.
Встроенный asm GNU C работает таким же образом для архитектур, отличных от x86 (вы по-прежнему используете операнды ввода и вывода с ограничениями для получения данных в / из операторов asm).
Есть различия: у многих целей нет синтаксиса ограничения для запроса определенного регистра (например, x86's "a"
для eax/rax).