Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Biehler Productions am 19. January 2006, 14:21
-
Hi,
ich versuche gerade meinen C Kernel zum laufen zu bringen.
Ich hab erstmal nur eine PRINT Funktion eingebaut.
Hier mal der Code:
[BITS 16]
EXTERN _main
jmp main_entry
main_entry:
mov ax,cs
mov ds,ax
mov es,ax
cli
mov ss,ax
mov sp,9000h
sti
call _main
jmp $
GLOBAL _prnt
_prnt:
push bp
mov bp,sp
push ax
push si
add bp,4
mov si,[bp]
mov al,[si]
mov ah,0eh
int 10h
pop si
pop ax
pop bp
ret
Kernel:
extern "C" void prnt(char *str);
int main()
{
prnt("W");
return 0;
}
so, nun wird aber kein X ausgegeben, sondern ein S.
So ist es scheinbar auch mit anderen Buchstaben.
Wo liegt da der Fehler?
Erstellen tu ich meinen Kernel mit ner Batchdatei:
cd C:\TC\BIN
nasm -f obj start.asm -o start.obj
tcc -c kernel.cpp
jloc make.txt kernel.bin
Als Emulator hab ich Bochs 2.2.1
-
du musst bp noch weiter erhöhen, da du auf dem stack die rücksprung addresse, bp, ax und si hast und danach erst der parameter kommt
-
In der Print Funktion addest du 4 zu BP.
Der Stack wächst nach unten, du must subtrahieren.
-
adden ist doch richtig, die parameter sind ja weiter oben, oder?
-
adden ist doch richtig, die parameter sind ja weiter oben, oder?
Also ich kenne mich mit C jetzt nicht so aus. Aber wenn du Werte auf den Stack schreibst z.B. so: push ax, dann wird der Wert von ax nach ss:sp geschrieben und sp um zwei bzw. vier subtrahiert.
bitmaster
-
Also ich kenne mich mit C jetzt nicht so aus. Aber wenn du Werte auf den Stack schreibst z.B. so: push ax, dann wird der Wert von ax nach ss:sp geschrieben und sp um zwei bzw. vier subtrahiert.
also zeigt sp jetzt auf die addresse weiter unten, als die des wertes. um an diesen ran zu kommen musst du also addieren
-
Achso, wenn du die Parameter haben willst, machst du das am besten so:
push bp
mov bp, sp
mov ax, [bp + 4]
pop bp
ret
oder
enter 0, 0
mov ax, [bp + 4]
leave
ret
Das ist schneller und ändert BP nicht.
-
Also, das bringt mich hier alles irgendwie nicht weiter:
GLOBAL _prnt
_prnt:
push bp
mov bp, sp
mov ax, [bp + 4]
mov si,ax
mov al,[si]
mov ah,0eh
int 10h
jmp $
Ich hab jetzt mal nen jmp $ eingefügt.
Betrachte ich in der Bochsout.txt den Register Dump, hat SI die richtige Adresse.
Sie würde auf 38h zeigen.
Genau da liegt ja eigentlich der Buchstabe k (zumindest dem Hexeditor nach).
Kann es sein, dass in der Zeile:
mov al,[si]
Eine falsche Offsetadresse verwendet wird?
EDIT:
Oh mist, ich habs jetzt selber :oops:
statt
[BITS 16]
EXTERN _main
jmp main_entry
main_entry:
hab ich jetzt:
[BITS 16]
EXTERN _main
jmp 07c0h:main_entry
main_entry:
es lag tatsächlich an der falschen Segmentadresse.
Sorry :oops:
nun scheints zu funktionieren.
-
Ich glaube bei nasm sollte das ganze durch die [org 7C00h] - Anweisung auch funktionieren.
[BITS 16]
[ORG 7C00]
...
JMP main_entry
Mfg ena