Как в C вывести аргумент функции, написанной на GNU Assembler (синтаксис AT&T)?

Есть задача – написать программу из двух модулей: один на C, второй на ассемблере. Все источники единогласно утверждают, что аргументы в функцию, написанную на ассемблере, передаются через стек. Пытаясь проверить это, хочу сделать простенькую программу, которая хотя бы выводила бы первый аргумент функции, принимающей два аргумента. Вот код:

// c_module.c

#include<stdlib.h>
#include<stdio.h>

extern int summ(int x, int y);

int main()
{

    int x = summ(5,6);

    printf("%d", x);

    return 0;
}
// asm_module.s

.text

.globl summ
.type summ, @function

summ:
    push %bp

    movq %rsp, %rbp
    movl 4(%rbp), %eax

    pop %bp

    ret

Выводит большое число, точно не 5. Пробовал вместо 4 в ассемблерном коде подставлять другие числа, т.е. брать другие части из стека, толку нет. Числа разные, но это всё равно не 5. Пробовал смотреть стек с помощью GDB сразу после вызова ассемблерной функции – тоже ноль результата, даже через отладчик я не нашёл аргумент в стеке.

Компилятор gcc, делаю всё на ОС KUbuntu.

Вопрос: где же всё-таки прячется этот первый аргумент и как его оттуда наконец достать и возвратить модулю С?


Ответы (1 шт):

Автор решения: V-Mor

Как оказалось, из-за того, что система x64, аргументы функции передаются через регистры. В частности, в данном конкретном случае, первый аргумент был передан в регистр %edi, второй – в %esi.

Таким образом, рабочий ассемблерный код примет следующий вид:

// asm_module.s 
.text 

.globl summ 
.type summ, @function 
summ: 
    push %bp 
    movq %rsp, %rbp 
    movl %edi, %eax 
    pop %bp 
    ret

По всей видимости, в системах x86 аргументы передаются, как и ожидалось, через стек.

→ Ссылка