02.07.2013 Views

如何使用AVR-GCC

如何使用AVR-GCC

如何使用AVR-GCC

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

在 C 代码中嵌入汇编指令<br />

一.<strong>GCC</strong> 的 ASM 声明<br />

首先看一个从 PORTD 读入数据的例子:<br />

asm(“in %0, %1” : “=r”(value) : “I”(PORTD) : );<br />

由上可以看出嵌入汇编的 4 个部分:<br />

1.汇编指令本身,以字符串“in %0, %1”表示;<br />

2.由逗号分隔的输出操作数,本例为“=r”(value)<br />

3.由逗号分隔的输入操作数,本例为“I”(PORTD)<br />

4.Clobber 寄存器<br />

嵌入汇编的通用格式为:<br />

asm(code : output operand list : input operand list : clobber list);<br />

例子中%0 表示第一个操作数,%1 表示第二个操作数。即:<br />

%0 “=r”(value)<br />

%1 “I”(PORTD)<br />

如果在后续的 C 代码中没有使用到汇编代码中使用的变量,则优化编译时会将<br />

这些语句删除。为了防止这种情况的发生,需要加入 volatile 属性:<br />

asm volatile (“in %0, %1” : “=r”(value) : “I”(PORTD) : );<br />

嵌入汇编的的 Clobber 寄存器部分可以忽略,而其他部分不能忽略,但可以为空。<br />

如下例:<br />

asm volatile(“cli” : :);<br />

二.汇编代码<br />

用户可以在 C 代码里嵌入任意的汇编指令,就如同在汇编器里写程序一样。

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!