Как вызвать функцию из файла C/C++ в NASM?
Решил написать операционную систему (без глобальных целей, просто как проект для души и практики) и задался глобальным вопросом. Не хочу в начале долго останавливаться на ассемблере. Языками выбрал NASM и C++. Теперь главный вопрос: как вызвать из .asm загрузчика функцию, которая находится в .cpp файле ядра? Должен ли я использовать linker или что-то другое?
Ответы (1 шт):
Примерно так (пример из моего кода):
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
файлы