Autor Thema: Problem mit Textausgabe  (Gelesen 6700 mal)

ASM-noob

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« 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?

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 26. June 2008, 21:00 »
Nach Ralf Brown's Interruptliste fehlt die initialisierung des bx-registers versuchs mal mit nem
mov bx, 0x0007     ; page: 0,  farbe: grau auf schwarzingend wo vor dem int 0x10
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 26. June 2008, 21:03 »
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ASM-noob

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. June 2008, 21:18 »
@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

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 26. June 2008, 22:14 »
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?
« Letzte Änderung: 26. June 2008, 22:17 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 27. June 2008, 15:09 »
-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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ASM-noob

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. June 2008, 15:30 »
jetzt habe ich den fehler gefunden ich habe vergessen am anfang vom code
org 0x7C00einzugeben und nun geht es also der text erscheint und man kann schreiben

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 27. June 2008, 15:41 »
Du lädst das Ding wirklich mit NTLDR?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ASM-noob

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 27. June 2008, 15:53 »
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

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 27. June 2008, 15:59 »
hi,
darf ich mal den Eintrag in deiner boot.ini sehen ? :)

Danke,
Stefan

ASM-noob

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 27. June 2008, 16:03 »
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
« Letzte Änderung: 27. June 2008, 17:45 von ASM-noob »

Sapphire

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 28. June 2008, 07:00 »
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
« Letzte Änderung: 28. June 2008, 07:02 von Sapphire »

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 28. June 2008, 11:00 »
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

ASM-noob

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 28. June 2008, 14:15 »
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"

Sapphire

  • Beiträge: 16
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 29. June 2008, 06:53 »
OK. Danke. Jetz weiß ich wieder was mehr ;)

 

Einloggen