c++ - 强制 GCC 在寄存器中传递参数

标签 c++ gcc inline-assembly cpu-registers

我开始尝试在 C++ 中使用内联 ASM,所以我写了这个小片段:

#include <iostream>

int foo(int, int, int);


int main(void)
{
    return foo(1,2,3);
}

int foo(int a, int b, int c)
{
    asm volatile("add %1, %0\n\t"
                 "add %2, %0\n\t"
                 "add $0x01, %0":"+r"(a):"r"(b), "r"(c):"cc");
}

输出以下汇编代码:

main:
.LFB969:
    subq    $40, %rsp
    .seh_stackalloc 40
    .seh_endprologue
    call    __main
    movl    $3, %r8d
    movl    $2, %edx
    movl    $1, %ecx
    call    _Z3fooiii

...未显示的内容...

_Z3fooiii:
.LFB970:
    .seh_endprologue
    movl    %ecx, 8(%rsp)
    movl    %edx, 16(%rsp)
    movl    %r8d, 24(%rsp)
    movl    16(%rsp), %edx
    movl    24(%rsp), %ecx
    movl    8(%rsp), %eax
/APP
 # 15 "K:\inline_asm_practice_1.cpp" 1
    add %edx, %eax
    add %ecx, %eax
    add $0x01, %eax
 # 0 "" 2
/NO_APP
    movl    %eax, 8(%rsp)
    ret

所以我可以看到它输入我的代码的位置,但是它上面的堆栈操作是什么?有什么办法可以摆脱它们吗?他们似乎没有必要。我应该能够拥有

(主要)

movl    $3, %r8d
movl    $2, %edx
movl    $1, %ecx
call    _Z3fooiii

(在 foo 中)

add %edx, %ecx
add %r8d, %eax
add $0x01, %eax
ret

我如何让 gcc 明白它不需要将东西压入堆栈并以不同的顺序将它们带回?我已经炒了 fastcall 和 regparam,但我找不到任何关于这个的信息。

最佳答案

您可能需要通过类似 -O2 的方式启用优化,以便让编译器尝试编写更好/更快的代码,而不是更简单/更容易调试/理解的代码。

关于c++ - 强制 GCC 在寄存器中传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24471469/

相关文章:

c - 随机化寄存器

visual-studio-2012 - MASM 从/到立即内存地址移动

C++ 仿函数作为函数指针

c++ - Visual Studio : Variable is being used without being initialized

可靠地触发别名错误的代码?

linux - 在 Linux 上选择 makefile 和 Makefile

c++ - 将数组各种类型传递给微 Controller 上的规则引擎的要求。类型转换有问题

c++ - shared_ptr 的动态转换

c - 在 Lua 中加载 C 库 -llua 未找到

c++ - 在 cout 中使用 Hook 函数时应用程序崩溃