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 代码里嵌入任意的汇编指令,就如同在汇编器里写程序一样。