Заставить GCC передавать аргументы в регистрах

Я начинаю пытаться возиться с встраиванием 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 и ничего не могу найти по этому поводу.

1

Решение

Возможно, вам нужно включить оптимизацию с помощью чего-то вроде -O2 чтобы компилятор пытался писать лучше / быстрее код, вместо этого проще / легче отлаживать / понимать код.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector