Как в 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 шт):
Как оказалось, из-за того, что система 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 аргументы передаются, как и ожидалось, через стек.