内嵌汇编例子

语法解释

__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input));

movl %1,%0"是指令模板;"%0"和"%1"代表指令的操作数,称为占位符,

本例中只有两个:"result"和"input",他们按照出现的顺序分 别与指令操作数"%0","%1"对应;

注意对应顺序:第一个C 表达式对应"%0";第二个表达式对应"%1",依次类推,操作数至多有10 个,分别用"%0","%1"...."%9"表示。

"result"前面的限制字符串是"=r",其中"="表示"result"是输出操作数

"r" 表示需要将"result"与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,当然指令执行 完后需要将寄存器中的值存入变量"result",从表面上看好像是指令直接对"result"进行操作,实际上GCC做了隐式处理,这样我们可以少写一 些指令。"input"前面的"m"表示该表达式需要先放入内存,然后在指令中使用参加运算。

asm ( assembler template         /* 汇编语句 */
    : output operands                  /* 输出寄存器 */
    : input operands                   /* 输入寄存器 */
    : list of clobbered registers     //会被修改的寄存器 
    );

// 先输入  再汇编指令  再输出

例子1

int result = 50;
    int input = 20;
    int num =0;
    // 从右边复制到左边
    __asm__ __volatile__ ("movl %1,%0" : "=r" (result),"=r"(num) : "m" (input),"r"(result));

    cout << "result := " << result << endl;
    cout << "input := " << input << endl;
    cout << "num := " << num << endl;

输出

result := 50
input := 20
num := 50

例子2

int c = 15;
int exchange_value = 5;
int compare_value = 10;
int num = 25;;
int num1 = 30;;
int * dest = &num;

__asm__ volatile ( "lock cmpxchgl %1,(%3)" // 汇编语句
    : "=b" (exchange_value) // 输出寄存器
    : "r" (c),"a" (num)/*eax*/,"r" (dest)
    : "cc", "memory"); //会被修改的寄存器
CMPXCHG SOURCE, DESTINATION
如果destination和EAX/AX/AL相等,把source加载到destination;
否则,把destination加载到EAX/AX/AL中

如果a的值num==*dest,则把c的值赋给*dest

打印dest := 15

int c = 15;
int exchange_value = 5;
int compare_value = 10;
int num = 25;;
int num1 = 30;;
int * dest = &num;

__asm__ volatile ( "lock cmpxchgl %1,(%3)" // 汇编语句
    : "=b" (exchange_value) // 输出寄存器
    : "r" (c),"a" (num1)/*eax*/,"r" (dest)
    : "cc", "memory"); //会被修改的寄存器

如果a的值num!=*dest,则*dest不会赋值

打印dest := 25

猜你喜欢

转载自blog.csdn.net/kq1983/article/details/114338178