再上一篇:19.4 访问特殊功能寄存器
上一篇:19.5 使用未支持的指令
主页
下一篇:第20章
再下一篇:20.2 uVison 使用入门
文章列表

19.6 GNU C 编译器的内联汇编

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

GNU的ARM C编译器是支持内联汇编的,但此时的汇编语法看起来有点怪:

asm (" inst1 op1, op2... \n" " inst2 op1, op2... \n"

...

" inst op1, op2... \n"

: 输出操作数s /* 可选 */

: 输入操作数s /* 可选 */

先举一个简单的例子,进入睡眠模式的代码如下所示:

void Sleep(void)

{

// 使用Wait-For-Interrupt进入睡眠模式

asm ( “WFI\n”

);

}

如果汇编代码需要一个输入变量和一个输出变量,例如,把一个变量除以5,则格式如下:

asm ( "mov r0, %0\n" "mov r3, #5\n"

"udiv r0, r0, r3\n" "mov %1, r0\n"

: "=r" (DataOut) : "r" (DataIn) : "cc", "r3" );

在这个代码中,输输入参数是一个C变量,名为DataIn(%0代表第一个参数),该代码把结果返 回到另外一个C变量DataOut中(%1表示第2个参数)。内联汇编的代码还手工修改了寄存器r3,并 且修改了条件标志cc,因此它们被列在被破坏的(clobbered)寄存器列表中。
更详细的内联汇编信息在GCC-Inline-Assembly-HOWTO文档中。