Как вызвать внешнюю функцию на ассемблере?

Я попытался использовать внешнюю функцию в коде сборки:

        .section    .rodata
    .LC0:
        .string "My number is: %lld"
        .text
        .globl  start
    start:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $16, %rsp
        movq    $12345, -8(%rbp)
        movq    -8(%rbp), %rax
        movq    %rax, %rsi
        movl    $.LC0, %edi
        movl    $0, %eax

        call    printf   # my external function

        # exit-syscall
        mov $1, %eax
        mov $0, %ebx
        int $0x80

Я собрал и связал с:

as -o myObjfile.o mySourcefile.s
ld -e start -o myProgram -lc myObjfile.o

Исполняемый файл - это сборка, но он не запускается, так что с ним не так?

1 ответ

Если я правильно понимаю, находится ли функция, которую вы хотите вызвать, в библиотеке C, вы можете просто объявить ее как внешнюю функцию.

    .section    .rodata
.LC0:
    .string "My number is: %lld"
    .text
    .extern printf    #declaring  the external function
    .globl  start
start:
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $16, %rsp
    movq    $12345, -8(%rbp)
    movq    -8(%rbp), %rax
    movq    %rax, %rsi
    movl    $.LC0, %edi
    movl    $0, %eax

    call    printf   # my external function

    # exit-syscall
    mov $1, %eax
    mov $0, %ebx
    int $0x80

Если это не работает, попробуйте явно связать его с stdlib.h

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