强制GCC在寄存器中传递参数 我开始尝试用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"); }

强制GCC在寄存器中传递参数 我开始尝试用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"); },c++,gcc,inline-assembly,cpu-registers,C++,Gcc,Inline Assembly,Cpu Registers,。。。未显示的内容 _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.cp

。。。未显示的内容

_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
所以我可以看到它在哪里输入我的代码,但是上面的堆栈操作是什么呢?我有没有办法摆脱他们;它们似乎没有必要。我应该可以

(主要部分)

(以富为单位)


我如何让gcc理解它不需要把东西推到堆栈上,然后以不同的顺序将它们带回来?我已经炸了fastcall和regparam,但我找不到任何关于这方面的信息。

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

如果将
foo
设置为内联函数会发生什么?奇怪的是,没有任何变化。。。这很奇怪…你是怎么编译的?这在windows上吗?32位?cygwin,我想我用的是64位版本?我在cigwin中提供的以gcc/g++结尾的每个文件中都尝试过它。仅供参考:如果您这样声明操作数:
[a]“+r”(a):[b]“r”(b),[c]“r”(c)
,那么您可以在asm中使用如下名称:
添加%[b],%%[a]
。可能更容易阅读。此外,此代码不需要volatile。关于re-volatile的讨论,请参阅上的文档。当我这样做时,它似乎将代码从foo直接复制到它在main中调用的位置。这仅仅是因为函数很小,所以很容易内联吗?虽然它确实可以工作(foo变成
。seh_endprologue/APP#8“K:\inline_asm_practice_1.cpp“1 add%edx,%ecx add%r8d,%ecx add$0x01,%ecx#0”2/NO#APP ret
),但Main变成
movl 1,%eax movl$3,%ecx movl$2,%edx/APP
,foo的代码副本粘贴在下面。有没有办法防止这种内联?(对于所有优化标志都是如此)如果内联有问题,则总是存在
\uuuu属性\uuuu((noinline))
。显然,您正在禁用gcc的优化,因此代码的效率会降低,但如果这是您想要的。。。
_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
add %edx, %ecx
add %r8d, %eax
add $0x01, %eax
ret