|
看帮助文档
内联汇编程序语法 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; }
|
|