使用C++编写程序集而不使用其他变量

Syn*_*ror 6 c++ x86 assembly g++ x86-64

我正在编写一个简单的C++程序,其中包含一些asm指令.

void call(){
    __asm__("mov    -0x10(%rbp),%eax;"
            "add    $0x10,%eax;"
            "mov    %eax,%edx;"
            "shr    $0x1f,%edx;"
            "add    %edx,%eax;"
            "sar    %eax;"
            "add    %eax,-0x4(%rbp);"
            "mov    $0x4c,%eax;"
            "mov    -0x8(%rbp),%eax;"
            "add    %eax,%eax;"
            "sub    -0x4(%rbp),%eax;"
            "add    %eax,-0xc(%rbp);");
}
Run Code Online (Sandbox Code Playgroud)

但是,从执行行为中我意识到由此asm主体操纵的寄存器实际上是由函数中的其他变量使用的.

反正有没有调用编译器隔离asm标签中使用的寄存器并确保它们不受影响?

操作系统:Linux编译器:G ++

非编译方法也受欢迎

ale*_*in0 2

作为一种非编译器方法:您可以使用pusha/popa指令在执行您自己的程序集之前将所有寄存器推送到堆栈,然后弹出所有寄存器。

代码示例:

void callOne(){
    __asm__(
        "pusha;"
        "mov    -0x10(%rbp),%eax;"
        "add    $0x10,%eax;"
        "mov    %eax,%edx;"
        "shr    $0x1f,%edx;"
        "add    %edx,%eax;"
        "sar    %eax;"
        "add    %eax,-0x4(%rbp);"
        "mov    $0x4c,%eax;"
        "mov    -0x8(%rbp),%eax;"
        "add    %eax,%eax;"
        "sub    -0x4(%rbp),%eax;"
        "add    %eax,-0xc(%rbp);"
        "popa;");
}
Run Code Online (Sandbox Code Playgroud)

  • @Ped7g:如果遵守Linux 64位系统V ABI(可能不是这种情况,因为OP当然没有提到什么操作系统)我会小心推入和弹出模板,因为你也可能必须考虑到红区可能正在发挥作用。 (2认同)