S
Schneemann
Routinier
Hi,
Frohes neues Jahr!
Also ich denke hier werden wieder einige rumheulen dass ich mal Google&SuFu benutzen soll. Hab ich gemacht, suche schon seit mehreren Stunden nach einer Lösung.
Also ich will mir einen kleinen bootbaren Kernel mit C (und natürlich ASM) schreiben. Hab ein sehr gutes Tutorial dafür gefunden. Leider ist das Tutorial nur für Windows, ich benutze Suse Linux 10.1 (KDE), deswegen benutze ich ein paar andere Programme usw.
Also ich benutze gcc zum kopilieren des C-Kodes, NASM für das Assemblieren und ld zum Linken.
Also ich habe mir zum assemblieren,kompilieren und linken ein shell-skript geschrieben:
Ganz einfach. So tut er alles bis beim Linker, da kommt die Fehlermeldung
Also start.obj wird, wie man sehen kann, aus dem ASM-Code erzeugt. So wie es scheint tut NASM mein Code nicht richtig assemblieren.
Hier ist der C-Code
Und dass hier ist der ASM-Code
Wie bekomm ich NASM dazu eine Datei zu erzeugen die ld versteht, oder wie bekomm ich ld dazu die NASM-Datei zu verstehen?
Frohes neues Jahr!
Also ich denke hier werden wieder einige rumheulen dass ich mal Google&SuFu benutzen soll. Hab ich gemacht, suche schon seit mehreren Stunden nach einer Lösung.
Also ich will mir einen kleinen bootbaren Kernel mit C (und natürlich ASM) schreiben. Hab ein sehr gutes Tutorial dafür gefunden. Leider ist das Tutorial nur für Windows, ich benutze Suse Linux 10.1 (KDE), deswegen benutze ich ein paar andere Programme usw.
Also ich benutze gcc zum kopilieren des C-Kodes, NASM für das Assemblieren und ld zum Linken.
Also ich habe mir zum assemblieren,kompilieren und linken ein shell-skript geschrieben:
Code:
nasm -f obj -o start.obj start.asm
gcc -c -o kernel.obj kernel.cpp
ld -o kernel.bin start.obj kernel.obj
Ganz einfach. So tut er alles bis beim Linker, da kommt die Fehlermeldung
Code:
start.obj: file not recognized: File format not recognized
Hier ist der C-Code
Code:
extern "C" void prnt(char *var);
extern char boot;
int main() {
char *str;
str=&boot;
prnt(str);
return 0;
}
Und dass hier ist der ASM-Code
Code:
[BITS 16]
EXTERN _main
start:
jmp 07c0h:main_entry
main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti
mov ah,02h
mov al,1
mov cl,2
mov ch,0
mov dl,0
mov dh,0
lea bx,[kernel]
int 13h
call _main
jmp $
;##Funktion zur Stringausgabe / Begrenzungszeichen: ASCII 0
GLOBAL _prnt
_prnt:
push bp
mov bp, sp
push ax
push si
mov ax, [bp + 4]
mov si,ax
prnt1:
mov al,[si]
cmp al,0
JE prnte
inc si
mov ah,0eh
int 10h
jmp prnt1
prnte:
pop si
pop ax
pop bp
ret
GLOBAL _boot
_boot db "Der erste C Kernel",13,10,0
times 510-($-$$) db 0 ;wichtig: Hier die Datei mit so vielen Bytes füllen, bis es genau 510 sind
dw 0aa55h ;Bootsignatur anhängen
kernel:
Wie bekomm ich NASM dazu eine Datei zu erzeugen die ld versteht, oder wie bekomm ich ld dazu die NASM-Datei zu verstehen?