一.嵌入汇编基础
嵌入式汇编语言存在怎样分配和使用寄存器,以及把C代码中的变量应该存放在哪个寄存器中。
嵌入式汇编的一般形式:
__asm__ __volatile__ ("<asm routine>" : output : input : modify);
__asm__表示汇编代码的开始,__volatile__(这是可选项)含义是避免“asm”指令被删除、移动或组合;
"<asm routine>"为汇编指令部分,"movl %%cr0,%0\n\t"。数字前加前缀“%“,如%1,%2等表示使用寄存器的样板操作数(在GCC内联汇编语句的指令部中,加上前缀'%'的数字 (如%0,%1) 表示的就是需要使用寄存器的"样板"操作数.指令部中使用了几个样板操作数,就表明有几个变量需要与寄存器相结合 )。可以使用的操作数总数取决于具体CPU中通用寄存器的数量,如Intel可以有8个。由于样板操作数的前缀使用了”%“,因此,在用到具体的寄存器时就在前面加两个“%”,如%%cr0。
输出部分
:"=r" (__dummy)
“=r”表示相应的目标操作数(指令部分的%0)可以使用任何一个通用寄存器,并且变量__dummy 存放在这个寄存器中,但如果是:
:“=m”(__dummy)
“=m”就表示相应的目标操作数是存放在内存单元__dummy中。
主要的约束字母及其含义
字母 |
含义 |
m, v,o |
表示内存单元 |
R |
表示任何通用寄存器 |
Q |
表示寄存器eax, ebx, ecx,edx之一 |