Я начинаю пытаться возиться с встраиванием ASM в C ++, поэтому я написал этот небольшой фрагмент:
#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
(в фу)
add %edx, %ecx
add %r8d, %eax
add $0x01, %eax
ret
Как мне заставить gcc понять, что ему не нужно помещать вещи в стек и возвращать их в другом порядке? Я уже поджарил fastcall и regparam и ничего не могу найти по этому поводу.
Возможно, вам нужно включить оптимизацию с помощью чего-то вроде -O2
чтобы компилятор пытался писать лучше / быстрее код, вместо этого проще / легче отлаживать / понимать код.