Смешивание assembler'а и c

Рейтинг: 0Ответов: 1Опубликовано: 14.04.2015

Здравствуйте! Пишу свою операционку. Очень понравилась 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, где эта функция?

Ответы

Ответов пока нет.