Ken*_*nyV 4 c++ assembly gcc inline-assembly
我决定开始学习一些内联汇编,但是我留下了一个简单的问题,我无法找到明确的答案。
以我在教程中发现的以下简单示例为例,该示例执行简单的加法:
int one,two,out;
one = 1;
two = 2;
__asm__ ( "add eax, ebx;" : "=a" (out) : "a" (one) , "b" (two) );
Run Code Online (Sandbox Code Playgroud)
请注意,在使用英特尔语法一段时间后,为了我自己的理智,我将 GCC 配置为使用英特尔语法而不是 AT&T。
现在假设我想省略“out”变量,而只是将输出存储在“one”中(或者“two”)。
我该怎么做?
用
__asm__ __volatile__(" add %0, %2": "=r" (one): "0"(one), "r" (two) )
Run Code Online (Sandbox Code Playgroud)
通过使用“=r”和“r”,您不会不必要地强制编译器使用特定寄存器,这有助于寄存器分配。“0”表示“使用与(输出)参数 0 相同”。
Edit3:two
参数是 in %2
,而不是 in %1
,它只是one
(与 相同的寄存器%0
)的第二个副本。%
应该使用single时也固定 double 。
Edit2:我还添加了__volatile__
以确保编译器不会移动或省略汇编代码,如果编译器认为您的代码没有做任何有用的事情,就会发生这种情况[通常是因为它不产生编译器稍后使用的输出]。随着__volatile__
编译器可保证不移动或删除汇编代码。
Edit1:修正语法。