小编The*_*God的帖子

在c ++中为变量的xor操作实现内联汇编程序的正确方法

我最近看过一篇关于如何使用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操作,这需要三个周期.我怎么能做到这一点?

c++ assembly inline xor

-1
推荐指数
1
解决办法
540
查看次数

标签 统计

assembly ×1

c++ ×1

inline ×1

xor ×1