PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NASM assembliert nicht richtig



Schneemann
01.01.2007, 19:19
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:


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


start.obj: file not recognized: File format not recognized

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


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


[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?