Spec-Zone.ru › C++

asm-объявление

asm-declaration позволяет встраивать исходный код на языке ассемблера в программу на C++. Это объявление является условно поддерживаемым и (начиная с C++11)определяемым реализацией, то есть оно может отсутствовать и, даже если предоставлено реализацией, (начиная с C++11)не имеет фиксированного значения.

Синтаксис

attr (optional) asm ( string-literal ) ; (до C++26)
attr (optional) asm ( balanced-token-seq ) ; (начиная с C++26)
attr - (начиная с C++11) любое количество атрибутов
string-literal - то же, что и в строковом литерале, включая необработанные строковые литералы
balanced-token-seq - последовательность токенов со сбалансированными круглыми, квадратными и фигурными скобками; любые ограничения на balanced-token-seq и его значение определяются реализацией

Пояснение

balanced-token-seq обычно представляет собой строковый литерал, содержащий короткую программу на языке ассемблера, которая выполняется при каждом выполнении этого объявления. Разные компиляторы C++ устанавливают весьма различные правила для asm-объявлений и используют разные соглашения о взаимодействии с окружающим кодом C++.

Как и другие блочные объявления, это объявление может находиться внутри блока (тела функции или другого составного оператора), а также, как и все остальные объявления, вне блока.

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_constexpr 201907L (C++20) Тривиальная инициализация по умолчанию и asm-объявление в функциях constexpr

Ключевые слова

asm

Пример

Демонстрируются два вида синтаксиса встроенного ассемблера, поддерживаемые компиляторами GCC/Clang. Эта программа корректно работает только на платформе x86_64 под Linux.

#include <iostream>

extern "C" int func(int x);
// the definition of func is written in assembly language
// raw string literal could be very useful
asm(R"(
.globl func
    .type func, @function
    func:
    .cfi_startproc
    movl %edi, %eax /* x is in RDI, see x86-64 calling convention */
    addl $1, %eax
    ret
    .cfi_endproc
)");

int main()
{
    int n = func(0110);
    // formerly non-standard inline assembly, made comforming by P2361R6
    asm ("leal (%0,%0,4),%0"
         : "=r" (n)
         : "0" (n));
    std::cout << "73*5 = " << n << std::endl; // flush is intentional

    // standard inline assembly
    asm ("movq $60, %rax\n" // the exit syscall number on Linux
         "movq $2,  %rdi\n" // this program returns 2
         "syscall");
}

Вывод:

73*5 = 365

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Корректное поведение
CWG 195 C++98 требовалась поддержка всех asm-объявлений сделано условно поддерживаемым
CWG 2262 C++11 к asm-объявлениям нельзя было применять атрибуты разрешено

Ссылки

  • Стандарт C++26 (ISO/IEC 14882:2026):
    • 9.10 Объявление asm [dcl.asm]
  • Стандарт C++23 (ISO/IEC 14882:2024):
    • 9.10 Объявление asm [dcl.asm]
  • Стандарт C++20 (ISO/IEC 14882:2020):
    • 9.10 Объявление asm [dcl.asm]
  • Стандарт C++17 (ISO/IEC 14882:2017):
    • 10.4 Объявление asm [dcl.asm]
  • Стандарт C++14 (ISO/IEC 14882:2014):
    • 7.4 Объявление asm [dcl.asm]
  • Стандарт C++11 (ISO/IEC 14882:2011):
    • 7.4 Объявление asm [dcl.asm]
  • Стандарт C++03 (ISO/IEC 14882:2003):
    • 7.4 Объявление asm [dcl.asm]
  • Стандарт C++98 (ISO/IEC 14882:1998):
    • 7.4 Объявление asm [dcl.asm]

См. также

  • ABI C++
Документация по C для встроенного ассемблера

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

1. Руководство по встроенному ассемблеру GCC
2. Встроенный ассемблер GCC — Locklessinc.com
3. Встроенный ассемблер IBM XL C/C++
4. Встроенный ассемблер Intel C++
5. Встроенный ассемблер Visual Studio
6. Операторы ассемблера Sun Studio 12
7. Встроенный ассемблер для HP-UX на базе Itanium
8. Соглашения о вызовах x86 — Википедия

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/asm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API