好的,这是gcc内联汇编程序,它非常强大但很难理解。
首先,%char是一个特殊的字符。它可以让你定义寄存器和数字占位符(稍后在此)。不幸的是,%也被用作寄存器名称的一部分(例如%EAX),所以在gcc内联汇编器中,如果要命名寄存器,则必须使用两个百分比字符。
%0,%1和%2(例如..)是占位符输入和输出操作数。这些在汇编程序字符串后面的列表中定义。 在你的例子中,%0成为y的占位符,%1成为x的占位符。编译器将确保变量在asm-code被执行前保存在输入操作数的寄存器中,并确保输出操作数将被写入输出操作数列表中指定的变量。
现在您应该了解r(y)是什么:它是一个输入操作数,它为变量y保留一个寄存器并将其分配给占位符%1(因为它是列在内联汇编器之后的第二个操作数串)。 有很多其他的占位符类型。 m让你指定一个内存位置,如果我没有弄错我可以用于数字常量。你会发现它们都列在gcc文档中。
然后是clobber列表。这份清单很重要!它列出了在您的汇编代码中被修改的所有寄存器,标志,存储位置等(例如您的示例中的EAX)。如果你得到这个错误,优化器将而不是知道什么已被修改,并且很可能你最终得到的代码不起作用。
你的例子几乎毫无意义。它只是将值X加载到寄存器中,并将该寄存器分配给EAX。之后,EAX被存储到另一个寄存器中,随后将成为你的变量。所以它只是一个简单的作业:
y = x;
一个最后一件事:如果你之前已经与英特尔式的汇编工作:你要倒读的论点。对于所有指令,源操作数是指令本身后面的操作数,目标操作数是逗号右侧的操作数。与英特尔语法相比,这恰恰相反。
另外我没有得到= r(y)和r(x)?还有什么是一个破碎的寄存器? – brett 2010-08-28 02:12:52
双百分号subquestion:http://stackoverflow.com/questions/14745631/what-does-a-double-percent-sign-do-in-gcc-inline-assembly – 2015-07-29 20:34:47
谨防基本VS扩展ASM:HTTP:// stackoverflow.com/a/31711138/895245 – 2015-07-29 21:08:32