80386有如下寄存器:
8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp;
8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp;
8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl。它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低8位;
6个段寄存器:%cs(code),%ds(data),%ss(stack), %es,%fs,%gs;
3个控制寄存器:%cr0,%cr2,%cr3;
6个debug寄存器:%db0,%db1,%db2,%db3,%db6,%db7;
2个测试寄存器:%tr6,%tr7;
8个浮点寄存器栈:%st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)。
操作数排列是从源(左)到目的(右),如“movl %eax(源), %ebx(目的)”
带有C/C++表达式的内联汇编格式为:
__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);
从中我们可以看出它和基本内联汇编的不同之处在于:它多了3个部分(Input,Output,Clobber/Modify)。在括号中的4个部分通过冒号(:)分开。
这4个部分都不是必须的,任何一个部分都可以为空。应用举例:
template<class T>
static inline T _atomic_xchg(volatile T *ptr, T value) \
{ \
T result; \
__asm__ __volatile__("lock\nxchg" " %0,%1" \
: "=r"(result), "=m"(*(volatile T*)ptr) \
: "0"(value), "m"(*(volatile T*)ptr) \
: "memory"); \
return result; \
}
解析:
__asm __ : ---expressing asm language
__volatile__:----telling complier not to optimize my asm coding
lock-------asm instruction, expressing synchronous operation
xchg-------asm insturction, expressing to exchange the values in *ptr and val varible
%0---------expressing *ptr variable
%1---------expressing val variable
"0"(val)--------expressing to input val variable into eax register in system
"m"(*ptr)------expressing that the data pointed by the pointer of ptr varable are stored in memory
"=r"(result), "=m"(*ptr)----expressing that the data exchanged will be store result and *ptr variable ,
"m" expresses to use memory to store the data of *ptr variable
"r" expresssed to use common register to store the data of val variable
网友评论