Передать аргумент из C в сборку? - PullRequest
2 голосов
/ 02 декабря 2010

Как передать аргумент из главной функции C в функцию ассемблера?Я знаю, что моя пользовательская функция должна выглядеть примерно так:

void function(char *somedata) __attribute__((cdecl));

Теперь, как бы я использовал somedata в файле сборки.Моя операционная система - Linux Ubuntu, а процессор - x86.

1 Ответ

13 голосов
/ 02 декабря 2010

Я немного новичок в этом, но, надеюсь, этот пример поможет вам в этом.Я протестировал его, и он работает, единственная проблема, с которой вы можете столкнуться, - это недоступность программного обеспечения.Я использую nasm для сборки.

main.c

extern void myFunc(char * somedata);

void main(){
    myFunc("Hello World");
}

myFunc.asm

section .text
    global myFunc
    extern printf

    myFunc:
        push ebp
        mov  ebp, esp

        push dword [ebp+8]
        call printf 

        mov esp, ebp
        pop ebp
        ret

COMPILE

nasm -f elf myFunc.asm
gcc main.c myFunc.o -o main

Примечания:

Вам необходимо установить nasm (ассемблер) (это ubuntu: sudo apt-get install nasm)

То, что в основном происходит в коде c, вызывает myFunc с сообщением.В myFunc.asm мы получаем адрес первого символа строки (который находится в [ebp + 8], смотрите здесь для информации (http://www.nasm.us/xdoc/2.09.04/html/nasmdoc9.html см. 9.1.2, который несколько описывает c соглашения о вызовах.), И мы передаем егоФункция printf (помещая ее в стек). printf находится в стандартной библиотеке c, которая по умолчанию автоматически связывает gcc с нашим кодом, если только мы не скажем.

Мы должны экспортировать myFunc в файл сборки иобъявите myFunc как функцию extrnal в файле main.c. В myFunc.asm мы также импортируем функцию printf из stdlib, чтобы мы могли вывести сообщение настолько просто, насколько это возможно.

Надеюсь, это поможет.

...