Namespaces
Variants

Inline assembly

From cppreference.net

Встроенный ассемблер (обычно вводится ключевым словом asm ) предоставляет возможность встраивать исходный код на языке ассемблера в программу на C.

В отличие от C++, встроенный ассемблер в C рассматривается как расширение. Он условно поддерживается и зависит от реализации, что означает, что он может отсутствовать и, даже если предоставляется реализацией, не имеет фиксированного значения.

Содержание

Синтаксис

asm ( string_literal ) ;

Объяснение

Этот синтаксис встроенного ассемблера принимается стандартом 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 объявления

Внешние ссылки

1. Руководство по встроенному ассемблеру GCC
2. Встроенный ассемблер IBM XL C/C++
3. Встроенный ассемблер Intel C++
4. Встроенный ассемблер Visual Studio
5. Операторы Asm в Sun Studio 12
6. Встроенный ассемблер для HP-UX на базе Itanium