Inline assembly
Встроенный ассемблер (обычно вводится ключевым словом asm ) предоставляет возможность встраивать исходный код на языке ассемблера в программу на C.
В отличие от C++, встроенный ассемблер в C рассматривается как расширение. Он условно поддерживается и зависит от реализации, что означает, что он может отсутствовать и, даже если предоставляется реализацией, не имеет фиксированного значения.
Содержание |
Синтаксис
asm (
string_literal
)
;
|
|||||||||
|
Этот раздел не завершён
Причина: необходимо добавить примечание о синтаксисе расширенной ассемблерной вставки GCC, поскольку он теперь поддерживается Intel, IBM, Sun (начиная с v12) и др. |
Объяснение
Этот синтаксис встроенного ассемблера принимается стандартом C++ и называется asm-declaration в C++. string_literal обычно представляет собой короткую программу на языке ассемблера, которая выполняется при каждом выполнении данной декларации. Различные компиляторы C++ имеют сильно отличающиеся правила для asm-деклараций и разные соглашения о взаимодействии с окружающим C++ кодом.
asm-объявление может появляться внутри блока (тела функции или другого составного оператора), и, как и все остальные объявления, это объявление также может находиться вне блока.
Примечания
MSVC не поддерживает встроенный ассемблер на процессорах ARM и x64, и поддерживает только форму, представленную с помощью __asm на процессорах x86.
При компиляции в режиме ISO C с помощью GCC или Clang (например, с опцией - std = c11 ), __asm__ должно использоваться вместо asm .
Примеры
Демонстрирует два вида синтаксиса встроенного ассемблера, предоставляемые компилятором GCC. Эта программа будет работать корректно только на платформе x86-64 под Linux. Обратите внимание, что "стандартный встроенный ассемблер" также рассматривается как расширение в стандарте C.
#include <stdio.h> extern int func(void); // the definition of func is written in assembly language __asm__(".globl func\n\t" ".type func, @function\n\t" "func:\n\t" ".cfi_startproc\n\t" "movl $7, %eax\n\t" "ret\n\t" ".cfi_endproc"); int main(void) { int n = func(); // gcc's extended inline assembly __asm__ ("leal (%0,%0,4),%0" : "=r" (n) : "0" (n)); printf("7*5 = %d\n", n); fflush(stdout); // flush is intentional // standard inline assembly in C++ __asm__ ("movq $60, %rax\n\t" // the exit syscall number on Linux "movq $2, %rdi\n\t" // this program returns 2 "syscall"); }
Вывод:
7*5 = 35
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- J.5.10 Ключевое слово asm (стр: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- J.5.10 Ключевое слово asm (стр: 422)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- J.5.10 Ключевое слово asm (стр. 580)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- J.5.10 Ключевое слово asm (стр. 512)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- G.5.10 Ключевое слово asm
Смотрите также
|
Документация C++
для
asm
объявления
|