我们先说结论"+r" (variable1)是告诉gcc,变量variable1(该变量是C语言中定义的)应该和cpu的一个通用寄存器绑定。注意,这个绑定行为发生在进入我们的内联汇编之前。 在进行具体的分析之前,需要明白两个概念。 输入变量(该变量在C语言中定义)一定是会和一个通用寄存器绑定在一起。绑定行为发生在进入内联汇编之前。 输出变量,就是cpu执行完我
现在,您应该了解R(Y)是:它是一个输入操作数,它保留了变量y的寄存器,并将其分配给占位符%1(因为它是内联汇编字符串之后列出的第二个操作数)。有很多其他占位符类型。 m允许您指定内存位置,如果我没有弄错,我可以用于数字常量。您将在GCC文档中找到所有列出。 然后有Clobber列表。此列表很重要!它列出了所有寄存器...
__asm__ __volatile__("movl %1,%0" : "=r" (result) : "m" (input));_asm_ 表示后面的代码为内嵌汇编,asm 是 _asm_ 的别名。_volatile_ 表示编译器不要优化代码,后面的指令保留原样,volatile 是它的别名。movl %1,%0 是指令模板;%0 和 %1 代表指令的操作数,称为占位符,内嵌汇...
result 前面的限制字符串是 =r ,其中 = 表示 result 是输出操作数, r 表示需要将 result 与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是 result 本身,当然指令执行完后需要将寄存器中的值存入变量 result (因为它是输出部分),从表面上看好像是指令直接对 result 进行操作,...
[v2], %%rcx\n\t" "VAGE_LOOP:\n\t" "mov (%%rbx), %%r8\n\t" "mov %%r8, (%%rcx)\n\t" "add $8, %%rbx\n\t" "add $8, %%rcx\n\t" "sub $8, %[v3]\n\t" "jne VAGE_LOOP\n\t" : [v3]"=r"(size) : [v1]"r"(dest),[v2]"r"(src),"[v3]"(size) : "rbx"...
输出操作数为 val1,属性为 "=r"。 输入操作数为 val2,属性为 "r" code 部分为 mov %1,%0, %0 表示输入输出列表中的第一个操作数,%1 表示操作数列表中提供的第二个操作数,以此类推,这条汇编指令很明显就是将第二个操作数(val2)赋值给第一个操作数(val1),所以最后的结果为 val1 = 222. 。
__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input)); "movl %1,%0"是指令模板;"%0"和"%1"代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数相对应。指令模板后面用小括号括起来的是C语言表达式,本例中只有两个:"result"和"input",他们按照出现的顺...
#include<stdio.h>intmain(){intdata1=10;intresult=20;asm("movl %1, %%eax;""addl %%eax, %0":"=r"(result)// output locations:"r"(data1),"0"(result)// input operands:"%eax"// 注意只有一个%,寄存器EAX将不再被编译器使用);printf("sum: %d\n",result);return0;} ...
r:表示操作数应放在一个通用寄存器中。 m:表示操作数应放在内存中。 i:表示操作数是一个立即数(常量)。 g:表示操作数可以是一个通用寄存器、内存或立即数。 0, 1, 2, ...:表示操作数与第几个操作数相同。 破坏描述符 "cc":表示汇编代码会修改条件码寄存器(condition code register)。
⾯的汇编语句:__asm__ __violate__ ("movl %1,%0" : "=r" (result) : "m" (input));"movl %1,%0"是指令模板;"%0"和"%1"代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语⾔表达式与指令操作数相对应。指令模板 后⾯⽤⼩括号括起来的是C语⾔表达式,本例中只有两个:"result...