Как вызвать функцию ассемблера из 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 шт):

Автор решения: KoVadim

Для начала надо хотя бы поправить явные ошибки.

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;
}
→ Ссылка
Автор решения: RandomDice 779
 ~ $ 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
→ Ссылка