Ich will nun in meinen Assemblerkernel C mit einbauen, indem ich das ganze einfach zusammenlinke, damit ich in C Funktionen aus de Assemblerteil aufrufen kann und umgekehrt
allerdings stürzt das Programm ab, ich denke ich weiß auch warum:
ich sage ld das der Code am Offset 0 anfängt im code stell ich dann noch ein dass er im Segment 1000 ist
also im endeffekt 1000:0000
das Problem ist nun, dass der C Teil aber erst 512 bytes hinter dem Assembler Teil anfängt, somit sind im C Teil alle Adressen falsch
wie kann ich die nun richtig machen?
für den C Teil müsste ich ld ja 200h als Startoffset übergeben der Assembler Teil braucht aber 0, ich muss das ganze aber zusammenlinken
ld Konfigurationsdatei:
OUTPUT_FORMAT("binary")
INPUT(askernel.o ckernel.o)
ENTRY(start)
SECTIONS
{
.text 0x0 : {
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(1);
}
.data : {
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(1);
}
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(1);
}
end = .; _end = .; __end = .;
}
C Teil:
__asm__ (".code16gcc\n");
int _main()
{
return(0);
}
Assembler Teil:
[BITS 16]
extern __main
global start
start:
cli
mov ax, cs
mov ds, ax
mov es, ax
sti
mov si, m_started
call text
mov si, absatz
call text
mov si, m_c
call text
mov si, absatz
call text
call __main
ende:
jmp ende
text:
lodsb
cmp al, 00h
je text_e
mov ah, 0eh
mov bx, 0007h
int 10h
jmp text
text_e:
ret
m_started db "kernel gestartet", 13, 10, 0
m_c db "ckernel wird gestartet...", 13, 10, 0
absatz db 13, 10, 0
times 512-($-$$) db 0
EDIT:
die Bochs Fehlermeldung ist übrigens "prefetch: RIP > CS.limit"
geb ich in der ld Konfigurationsdatei statt 0 200 ein, funktioniert wie erwartet der Assemblerteil nicht