Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: ASM-noob am 26. June 2008, 20:31
-
Hi@all
ich bin noch ein noob beim Thema Assembler aber die wichtigsten Befehle beherrsche ich
ich habe mir einen einfachen Kernel gebastelt und habe ihn mit NTLDR gestartet.
Der Kernel soll nur einen kurzen Text ausgeben und man kann Text eingeben
wenn man die Taste 0 drückt rebootet der kernel
start:
mov si,msg
call putmsg
call schreiben
msg db "Schreib irgendeinen Text:",13,10,0
putmsg:
lodsb
or al,al
jz putmsgend
mov ah,0Eh
int 10h
jmp putmsg
putmsgend:
retn
schreiben:
mov ah,00h
int 16h
mov ah,0Eh
int 10h
cmp al,48
je reboot
jmp schreiben
reboot:
jmp 0xffff:0x0000
aber wenn der kernel ausgeführt wird erscheint nicht der Text "Schreib irgendeinen Text" aber man kann normal mit der Tastatur was schreiben und er rebootet beim drücken auf die Taste 0.
Was stimmt nicht mit der funktion putmsg? :?
oder habe ich den ganzen code falsch geschrieben?
-
Nach Ralf Brown's Interruptliste (http://www.ctyme.com/intr/rb-0106.htm) fehlt die initialisierung des bx-registers versuchs mal mit nem
mov bx, 0x0007 ; page: 0, farbe: grau auf schwarz
ingend wo vor dem int 0x10
-
Die Adresse des Labels 'msg' ist sehr wahrscheinlich falsch. Da ich aber nicht weiß wohin (an welche Adresse) NTLDR den Kernel lädt und wie die Segmentregister danach aussehen, ist es schwer dir konkret zu helfen.
-
@MNemo
ne das löst auch nicht das Problem
@bluecode
ich habe den kernel in einem Ordner auf der 1. Festplatte gespeichert
NTLDR ist ebenfalls auf der 1. Festplatte
wenn NTLDR den kernel ausführt erscheint nur ein mergwürdiges T
bei dem T fehlt ein kleines stück an der linken seite
-
also BlueCode hat auf jeden fall recht, ich hab da irgendwie nicht so drauf geachtet.
es ist natürlich wichtig zu wissen was der NTLDR macht:
-schaltet er den Proteced mode ein?
-wohin lädt er den kernel?
-welches dateiformat erwartet er?
-
-wohin lädt er den kernel?
(ich sag es nur nochmal deutlich, da er meinen oberen Post da missverstanden hat)
Der Bootloader (NTLDR) lädt deinen Kernel ja in den Speicher. Es ist nun wichtig zu wissen an welche physische Adresse dein Kernel geladen wird, sonst stimmen die Adressen der Labels (z.B. 'msg') nicht, d.h. wenn du auf 'msg' zugreifen möchtest wird in Wirklichkeit an der falschen physischen Adresse nachgeschaut und es kommt natürlich nur Müll dabei raus.
Ich konnte jetzt auf Anhieb aber auch nicht rausfinden, was denn der NTLDR genau macht, insofern würde ich dazu raten einen anderen Bootloader zu verwenden (ABER: Vorsicht! Wenn du nicht ausreichend Kenntnisse dahingehend hast, dann installier keinen Bootloader auf deinem PC, sonst wirst du Windows evtl. nicht mehr booten können). Aber wenn du eine gute Dokumentation zu NTLDR findest, kannst du ja mal einen Link posten, dann kann man dir vielleicht besser helfen. Ich würde aber schätzen, dass Microsoft das wie so oft nicht öffentlich zugänglich dokumentiert hat.
-
jetzt habe ich den fehler gefunden ich habe vergessen am anfang vom code
org 0x7C00
einzugeben und nun geht es also der text erscheint und man kann schreiben
-
Du lädst das Ding wirklich mit NTLDR?
-
ja ich habe in der boot.ini die adresse von der Datei eingegeben und noch die Beschreibung und er startet normal ohne probleme den kernel
-
hi,
darf ich mal den Eintrag in deiner boot.ini sehen ? :)
Danke,
Stefan
-
kein problem
das ist der inhalt der boot.ini
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.0
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.0="Microsoft Windows XP Home Edition" /fastdetect /NoExecute=OptIn
C:\NanoOS\NanoOS.bin="NanoOS"
Die letzte Zeile habe ich eingefügt sonst habe ich nix verändert in der Datei
-
Ich bin da jetzt nicht so gut informiert aber liegt an 0x7C00 nicht normalerweise der Bootloader ?
Und bei dieser boot.ini find ich es auch komisch das er
C:\NanoOS\NanoOS.bin="NanoOS"
findet. Denn der Laufwerksbuchstabe C wird doch erst von Windows vergeben wenn es gestartet wird oder? Und vorher ist er in der Registry gespeichert.
Also müsstes du deine Datei eigentlich genau so angeben wie der Eintrag von Windows:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.0="Microsoft Windows XP Home Edition"
Also ist für mich alles sehr komisch. Kann natürlich auch sein das es schon alles so seine richtigkeit hat. :)
Gruß Sapphire
-
Hi,
ich habe da mal ein wenig rumgespielt und nachgelesen. Der NTLDR hat eine Option eingebaut, um einen Bootsektor von der Partition nachzuladen, worauf der NTLDR selber liegt. Diese Partition wird wohl einfach mit C:\ bezeichnet. Dieser wird dann an die Adresse 0x7C00 geladen.
Grüße,
Stefan
-
sapphire die Zeile
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS.0="Microsoft Windows XP Home Edition"
muss man nur eingeben falls man ein Windows betriebsystem booten will (hier z.b. WindowsXP)
aber ein betriebsystem wie Linux würde er nicht starten (jedenfalls habe ich es so gelesen)
da muss man nur die Adresse also wie bei mir z.b. C:\NanoOS\NanoOS.bin und nur noch die Beschreibung also den Namen des Betriebsystems z.b. ="NanoOS"
-
OK. Danke. Jetz weiß ich wieder was mehr ;)