Как вызвать функцию из файла C/C++ в NASM?

Решил написать операционную систему (без глобальных целей, просто как проект для души и практики) и задался глобальным вопросом. Не хочу в начале долго останавливаться на ассемблере. Языками выбрал NASM и C++. Теперь главный вопрос: как вызвать из .asm загрузчика функцию, которая находится в .cpp файле ядра? Должен ли я использовать linker или что-то другое?


Ответы (1 шт):

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

Примерно так (пример из моего кода):

  • kentry.asm:
    extern kmain
    
    section .text
    global _start
    
    _start:
        call kmain
        jmp $
  • kernel.cpp:
extern "C" void kmain() {
    while(1);
}
  • linker.ld:
OUTPUT_FORMAT("binary")
ENTRY(_start)

SECTIONS {
    .text 0x200000 : {
        *(.text)
        *(.code)
        *(.rodata*)
    }
    .data ALIGN(0x1000) : {
        *(.data)
    }
    .bss ALIGN(0x1000) : {
        *(.bss)
    }
} 
  • Такими командами собирается:

    nasm -f elf64 -o kentry.o kentry.asm

    x86_64-elf-g++ -c -m64 -g -ffreestanding -nostdlib -o kernel.o kernel.cpp, g++ компилирует и C и C++

    x86_64-elf-ld -m elf_x86_64 -T linker.ld -nostdlib -o kernel.bin kentry.o kernel.o + можно дописать другие .o файлы

→ Ссылка