美文网首页
__asm__ __volatile__ GCC的内嵌汇编语法

__asm__ __volatile__ GCC的内嵌汇编语法

作者: 星夜兼程工作笔记 | 来源:发表于2019-10-10 20:48 被阅读0次

    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

    相关文章

      网友评论

          本文标题:__asm__ __volatile__ GCC的内嵌汇编语法

          本文链接:https://www.haomeiwen.com/subject/qhtzpctx.html