Autor Thema: c kernel / richtige parameterübergabe?  (Gelesen 7115 mal)

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« 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

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #1 am: 19. January 2006, 17:39 »
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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 19. January 2006, 17:42 »
In der Print Funktion addest du 4 zu BP.
Der Stack wächst nach unten, du must subtrahieren.

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #3 am: 19. January 2006, 17:43 »
adden ist doch richtig, die parameter sind ja weiter oben, oder?

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 19. January 2006, 17:46 »
Zitat von: maumo
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
In the Future everyone will need OS-64!!!

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #5 am: 19. January 2006, 17:49 »
Zitat
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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 19. January 2006, 17:50 »
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.

Biehler Productions

  • Beiträge: 51
    • Profil anzeigen
    • http://bielos.de.tk
Gespeichert
« Antwort #7 am: 19. January 2006, 18:07 »
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.

ena

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 22. January 2006, 14:11 »
Ich glaube bei nasm sollte das ganze durch die [org 7C00h] - Anweisung auch funktionieren.


[BITS 16]
[ORG 7C00]
...
JMP main_entry


Mfg ena

 

Einloggen