Смешивание assembler'а и c
Здравствуйте! Пишу свою операционку. Очень понравилась MikeOS, но она вся на ассемблере. Пытаюсь сделать свою. Есть код на Ассемблере:
BITS 16
extern main
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax
mov si, text_string
call clear_screen
call print_string
jmp $
text_string db 'EOS ready', 0
;call main
clear_screen:
pusha
mov dx, 0
mov ah, 6
mov al, 0
mov bh, 7
mov cx, 0
mov dh, 24
mov dl, 79
int 10h
popa
ret
print_string:
mov ah, 0Eh
.repeat:
lodsb
cmp al, 0
je .done
int 10h
jmp .repeat
.done:
ret
times 510-($-$$) db 0
dw 0xAA55
Это жалкое подобие загрузчика системы.
Также есть код на Си, описывающий функцию main
.
#include <stdio.h>
extern int main (void)
{
char* str = "print from C :)";
printf("%s", str);
return 0;
}
Как это все склеить вместе? (Смешать Си и Ассемблер)?
Как вызвать функцию, описанную в файле си, в программе на ассемблере? При попытке компиляции такого кода:
void kernel_main(){
...
}
...
call kernel_main
...
пишет:
boot/boot.s:16: error: symbol `kernel_main' undefined
Что как указать компилятору nasm, где эта функция?
Источник: Stack Overflow на русском