4

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

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

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”中(或者“两个”,对于所有重要的事情)。

我该怎么做?

4

2 回答 2

5

利用

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

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

Edit3:two参数是 in %2,而不是 in %1,这只是one(与 相同的寄存器%0)的第二个副本。%当应该使用单时,也固定双。

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

Edit1:修复语法。

于 2013-04-13T23:14:04.837 回答
3
__asm__ ( "add eax, ebx;" 
            : "+a" (one) 
            : "b" (two) );

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

于 2013-04-13T23:27:04.193 回答