我最近看过一篇关于如何使用xor'ing而不是使用临时变量来执行交换操作的文章.当我使用int a ^= b;结果编译代码时,不会简单地(对于at&t语法)
xor b, a
etc.
Run Code Online (Sandbox Code Playgroud)
相反,它会将原始值加载到寄存器中,然后将其写回寄存器.为了优化这个,我想在内联汇编中写这个,所以它只使用三个滴答来完成整个事情,而不是像正常情况那样.
我尝试了多个关键字:
asm(...);
asm("...");
asm{...};
asm{"..."};
asm ...
__asm ...
Run Code Online (Sandbox Code Playgroud)
这些都没有用,要么给我一个语法错误,gcc似乎不接受所有的语法或者说
main.cpp: Assembler messages:
main.cpp:12: Error: too many memory references for `xor'
Run Code Online (Sandbox Code Playgroud)
基本上,我想使用我在汇编程序块中使用的c ++代码中定义的变量,使用三行来对它们进行xor,然后让我的交换变量基本上像这样:
int main() {
volatile int a = 5;
volatile int b = 6;
asm {
xor a,b
xor b,a
xor a,b
};
//a should now be 6, b should be 5
}
Run Code Online (Sandbox Code Playgroud)
澄清一下:我想避免使用编译器生成的mov操作,因为它们需要更多的cpu周期,而不是只执行三个xor操作,这需要三个周期.我怎么能做到这一点?