__asm("NOP");
__asm("NOP");
看帮助文档
内联汇编程序语法
RealView® Compilation Tools for μVision Compiler User Guide Version 3.1
Home > Using the Inline and Embedded Assemblers > Inline assembler > Inline assembler syntax
6.1.1. Inline assembler syntax
ARM 编译器支持 asm 关键字 (C++) 或 __asm 关键字(C 和 C++)引入的一种扩展内联汇编程序语法。以下各节介绍这些关键字的语法:
含有 asm 关键字的内联汇编
含有 __asm 关键字的内联汇编
使用 __asm 和 asm的规则
在代码的任何位置,都可以使用 asm 或 __asm 语句。
内联汇编程序支持 ARM 指令全集,包括通用协处理器指令,但不包括 BX, BLX, 和 BXJ 。
内联汇编程序支持ARMv6的子集。该子集仅包含ARMv6的媒体指令。更多信息请查看 内联汇编操作的限制i 。
含有 __asm 关键字的内联汇编
内联汇编程序用汇编程序标志符调用,其后跟随用大括号括起来的汇编程序指令列表。使用汇编程序标志符的内联汇编程序代码具有下列格式:
对于单行,例如:
__asm("instruction[;instruction]"); // Must be a single string
__asm{instruction[;instruction]}
不能包含注释。
对于多行,例如:
__asm
{
...
instruction
...
}
在内联汇编语言块内的任何位置,都可以使用 C或 C++ 注释。
更多相关信息也可查看 使用 __asm 和 asm 的规则
含有 asm 关键字的内联汇编
ARM 编译器支持 ISO C++ 标准中的asm语法。可以用以下格式来使用内联汇编:
对于单行,例如:
asm("instruction[;instruction]"); // Must be a single string
asm{instruction[;instruction]}
不能包含注释。
对于多行,例如:
asm
{
...
instruction
...
}
在内联汇编语言块内的任何位置,都可以使用 C或 C++ 注释。
使用 __asm 和 asm 的规则
在使用 __asm 和 asm 关键字时要遵循以下规则:
如果在同一行有多条指令,则必须用分号 (;) 将它们分开。如果使用双引号,则要保证所有的指令在一对双引号 (") 之内。
如果一条指令需要占用多行,必须用反斜线()符号指定续行。
对于多行的格式,在内联汇编语言块内的任何位置,都可以使用 C或 C++ 注释。但在含有多条指令的同一行不能有嵌入注释。
逗号 (,) 作为汇编语言的一个分隔符,在C语言中的逗号必须在圆括号之内以区别它们。
__asm
{
ADD x, y, (f(), z)
}
asm 语句必须在 C++ 函数内。在C++的任何地方均可申明 asm 语句。
在内联汇编中的寄存器被当作C/C++的变量。这些寄存器的名字没必要和物理寄存器的名字相关联,(可查看 虚拟寄存器 )。如果没有将寄存器定义为一个C/C++变量,编译器会产生一个警告。
在内联汇编中不需要保存和恢复寄存器值。编译器为你做这些。而且,内联汇编不能直接访问物理寄存器。可查阅 虚拟寄存器 以获得更多相关信息。
如果除 CPSR 和 SPSR 之外的寄存器在写之前读,则会产生错误,例如:
int f(int x)
{
__asm
{
STMFD sp!, {r0} // save r0 ‑ illegal: read before write
ADD r0, x, 1
EOR x, r0, x
LDMFD sp!, {r0} // restore r0 ‑ not needed.
}
return x;
}
以上函数可以正确地写为:
int f(int x)
{
int r0;
__asm
{
ADD r0, x, 1
EOR x, r0, x
}
return x;
}