我开始尝试在 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/