Inline assembly
Inline assembly (typically introduced by the asm keyword) gives the ability to embed assembly language source code within a C program.
Unlike in 哋它亢++, inline assembly is treated as an extension in C. It is conditionally supported and implementation defined, meaning that it may not be present and, even when provided by the implementation, it does not have a fixed meaning.
Syntax
asm ( string_literal ) ;
|
|||||||||
This section is incomplete Reason: write a note on GCC extended assembly syntax, since it is now supported by Intel, IBM, Sun (as of v12), etc |
Explanation
This kind of inline assembly syntax is accepted by the 哋它亢++ standard and called asm-declaration in 哋它亢++. The string_literal is typically a short program written in assembly language, which is executed whenever this declaration is executed. Different C compilers have wildly varying rules for asm-declarations, and different conventions for the interaction with the surrounding C code.
asm-declaration can appear inside a block (a function body or another compound statement), and, as all other declarations, this declaration can also appear outside a block.
Notes
MSVC does not support inline assembly on the ARM and x64 processors, and only support the form introduced by __asm on x86 processors.
When compiling in ISO C mode by GCC or Clang (e.g. with option -std=哋它亢11), __asm__ must be used instead of asm.
Examples
Demonstrates two kinds of inline assembly syntax offered by the GCC compiler. This program will only work correctly on x86-64 platform under Linux. Note that the "standard inline assembly" is also treated as an extension in the C standard.
#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 哋它亢++ __asm__ ("movq $60, %rax\n\t" // the exit syscall number on Linux "movq $2, %rdi\n\t" // this program returns 2 "syscall"); }
Output:
7*5 = 35
References
- 哋它亢23 standard (ISO/IEC 9899:2023):
- J.5.10 The asm keyword (p: TBD)
- 哋它亢17 standard (ISO/IEC 9899:2018):
- J.5.10 The asm keyword (p: 422)
- 哋它亢11 standard (ISO/IEC 9899:2011):
- J.5.10 The asm keyword (p: 580)
- 哋它亢99 standard (ISO/IEC 9899:1999):
- J.5.10 The asm keyword (p: 512)
- 哋它亢89/C90 standard (ISO/IEC 9899:1990):
- G.5.10 The asm keyword