Linux C语言内联汇编-读写变量

基本格式:

asm [ volatile ] (  
        assembler template                                 //汇编代码
        [ : output operands ]                /* optional *///输出运算符列表
        [ : input operands  ]                /* optional *///输入
        [ : list of clobbered registers ]    /* optional *///被修改资源列表
        );
int main() {
    int a, b, c, d, e;


    a = 10;
    b = 20;
    __asm__("movl %4, %%eax;"       //%eax = a; a存在%ecx
            "movl %%eax, %0;"       //c = %eax;
            "movl %5, %1;"          //d = b;
            "movl %6, %2;"          //e = 30;
            "mov $1, %4;"           //a = 1;
            :"=r"(c), "=b"(d), "=r"(e), "=c"(a)
            :"3"(a), "m"(b), "i"(30)
            );
    cout << a << " " << c << " " << d <<  " " << e << endl;


    return 0;
}

%0-%6分别表示输入输出表中,变量的顺序;

"="表示只写,输出特有;还有"&"见本文结尾;

"r"约束指明可以先将变量c存入任一可用的寄存器;

同理:     a : %eax, %ax, %al

                b : %ebx, %bx, %bl

                c : %ecx, %cx, %cl

                d : %edx, %dx, %dl

                S : %esi, %si

                D : %edi, %di

"m"修饰表示直接操作内存;

"i"修饰表示立即数;还有"o","V","g","n"等见本文结尾;

"3"当一个变量既是输入又是输出时,可以用该变量的输出序号来表示输入约束,如上述的变量a;

用g++ -S查看编译后的代码:

#APP
# 18 "main.cpp" 1
	movl %ecx, %eax;movl %eax, %edi;movl -36(%rbp), %ebx;movl $30, %edx;mov $1, %ecx;
# 0 "" 2
#NO_APP

其他约束符介绍:GCC-Inline-Assembly-HOWTO

猜你喜欢

转载自blog.csdn.net/M_N_N/article/details/80784872
今日推荐