Передать аргумент от C до сборки?

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам