扩展的内联汇编:输入和输出的相同变量

时间:2013-04-13 23:09:36

标签: c++ gcc assembly inline-assembly

我决定开始学习一些内联汇编,但是我留下了一个简单的问题,我无法找到明确的答案。

采用我在教程中找到的以下简单示例,该示例执行简单的添加:

int one,two,out;

one = 1;
two = 2;

__asm__ ( "add eax, ebx;" : "=a" (out) : "a" (one) , "b" (two) );

请注意,在使用intel语法一段时间后,为了我自己的理智,我将GCC配置为使用intel语法而不是AT& T.

现在假设我想省略“out”变量,只是将输出存储在“one”中(或者将“2”存储到所有重要的位置)。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

使用

 __asm__ __volatile__(" add %0, %2": "=r" (one): "0"(one), "r" (two) )

通过使用“= r”和“r”,您不会不必要地强制编译器使用特定寄存器,这有助于寄存器分配。 “0”表示“使用与(输出)参数0相同”。

Edit3:two参数位于%2,而不是%1,这只是one的第二个副本(与%0相同的注册) 。当应该使用单个时,也修复了双%

Edit2:我还添加了__volatile__以确保编译器不移动或省略汇编代码,如果编译器认为您的代码没有做任何有用的事情,这可能会发生[通常因为它没有产生任何输出编译器稍后使用]。使用__volatile__,编译器保证不移动或删除汇编代码。

Edit1:修复语法。

答案 1 :(得分:1)

__asm__ ( "add eax, ebx;" 
            : "+a" (one) 
            : "b" (two) );

"+"修饰符表示“读/写”操作数(必须在输出约束中使用)。