Как вызвать функцию ассемблера из C?
function.asm:
.data
strink:
.string "It works!"
len = . - strink
globl functin
functin:
// int write(int fd, const void *buf, size_t count)
mov x0, 1
ldr x1, =strink
ldr x2, =len
mov w8, #64
svc #0
А как эту функцию вызвать из C, C++ кода?
#include <stdio.h>
int main() {
// что тут должно быть?
return 0;
}
Ответы (2 шт):
Для начала надо хотя бы поправить явные ошибки.
globl functin
тут явно должно быть вот так
.text
.global functin
то есть, саму функцию надо поместить в секцию для кода, а то в секции для даты оно не исполняется.
Я не знаю ассемблера от arm поэтому, пока удалим все тело и напишем просто ret в конце и это будет все тело. Нам же потестировать нужно.
Также напишем makefile, а то ручками собирать лень
У меня получилось вот так
all: main.o file.o
gcc -ggdb main.o file.o -o result
main.o: main.c
gcc -ggdb main.c -c -o main.o
file.o: file.asm
as -g file.asm -o file.o
clean:
rm *.o
rm result
Теперь сделаем вызов. Наша функция пока ничего не принимает и ничего не возвращает. Ее сигнатура для си будет вот такая
extern void functin();
и теперь можно позвать functin();
Все, теперь оно как минимум компилируется, линкуется и работает.
Что делает именно Ваш код - я не знаю, поэтому, угадать сигнатуру мне сложно.
upd, как выглдяит main.c
#include <stdio.h>
extern void functin();
int main() {
// что тут должно быть?
functin();
return 0;
}
~ $ make all
GCC main.o file.o
ld.lld: error: relocation R_AARCH64_ABS64 cannot be used against local symbol; recompile with -fPIC
>>> defined in asm.o
>>> referenced by print.asm:14
>>> asm.o:(.text+0x18)
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:3: all] Error 1