Встроенный ассемблерный код может быть введен в функцию C ++ с помощью asm объявления .Эта конструкция поддерживается условно и определяется реализацией.
В большинстве реализаций объявление asm ожидает некоторую форму символического языка ассемблера, а не двоичного объектного кода.
Вот пример использования конструкции объявления asm
с GCC на x86.
#include <iostream>
template <int nontype>
int add(int operand)
{
int sum;
asm ("movl %1, %0\n\t"
"addl %2, %0"
: "=r" (sum)
: "r" (operand), "r" (nontype)
: "0");
return sum;
}
int main()
{
std::cout << add<42>(6) << "\n";
}
Это печатает, как и ожидалось, 48.
Обратите внимание, что версия asm
для gcc довольно мощная, и ее синтаксис должен выходить за рамки того, что указано в стандарте, для поддержки его многочисленных функций.Другие реализации могут предлагать или не предлагать такую гибкость (или вообще предлагать что-либо вообще - конструкция поддерживается условно).
Приведение между указателями на функции и указателями на данные является неопределенным поведением в C ++.Реализации могут делать с ними все, что захотят.Я полагаю, что использование этой конкретной формы UB для дублирования совершенно хорошей функциональности объявления asm было бы довольно незначительным в списках задач большинства разработчиков.