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