os loader/kernel läuft nicht
-
Der folgende Code (3 separate binäre Dateien) lief auf einem 8086-Emulator, jedoch nicht auf echten x86-Prozessoren:
(1440k raw floppy head0 cylinder0)
sector1 (Bootsektor):
ORG 7C00hMOV AH, 02h
MOV AL, 1
MOV CH, 0
MOV CL, 2
MOV DH, 0
MOV DL, 0
MOV BX, 0050h
MOV ES, BX
MOV BX, 0INT 13h
JMP 0050h:0000hsector2:
ORG 0000hMOV AH, 02h
MOV AL, 1
MOV CH, 0 ; ZYLINDER
MOV CL, 3 ; SEKTOR
MOV DH, 0 ; KOPF
MOV DL, 0 ; LAUFWERK A:
MOV BX, 0052h
MOV ES, BX
MOV BX, 0INT 13h
JMP 0052h:0000hsector3:
ORG 0000h
JMP startmsg_boot_complete DB 'XXXX 1.0.0001u', 13, 10, 'Copyright 2004 XXXXXX XXXXXXX', 13, 10, 'All rights reserved'
start
MOV BX, 9FF0h
MOV SS, BX
MOV SP, 0MOV BX, 0052h
MOV CS, BX
MOV BX, CS
MOV DS, BXMOV AH, 00h
MOV AL, 03h
INT 10hMOV AH, 06h
MOV AL, 0
MOV BH, 0
MOV CX, 0
MOV DH, 24
MOV DL, 79
INT 10hMOV BX, DS
MOV ES, BX
MOV BP, msg_boot_complete
MOV AH, 13h
MOV AL, 1
MOV BH, 0
MOV BL, 00001111b
MOV CX, 66
MOV DX, 0
INT 10hMOV AH, 0
INT 16hJMP start
-
Hi.
Ich habe den Code jetzt nicht ausprobiert, aber folgendes ist mir so beim Ueberfliegen aufgefallen:
MOV AH, 02h MOV AL, 1
Der Code eines solchen Gestueckels ist nicht nur unnoetig gross, sondern in diesem Fall auch noch unnoetig langsam. Am besten waere es also, wenn du gleich das entsprechende 16Bit-Register setzt. Wenn du aber unbedingt die 8Bit-Register einzeln setzten willst, dann versuch doch wenigstens die Zugriffe auf 8Bit-Teile eines Regsisters so weit wie moeglich von einander zu trennen.
Du versuchst Sektoren vom Laufwerk zu lesen, ohne es vorher zu resetten (Funktion 0 vom int 13h). Zudem waere vielleicht eine Fehlerbehandlung (Falls int 13h CF setzt) recht sinnvoll.
Meinst du nicht auch, dass du den Stack etwas zu spaet initialisierst?
Zudem solltest du vielleicht darauf achten, dass du den Stack nicht durch den Grafikkartenspeicher bei A0000h legst.MOV BX, 0052h MOV CS, BX MOV BX, CS
Muss man nicht verstehen, was du damit bezweckst, oder?
-
kein wunder, offensichtlich ist der emulator unsauber programmiert:
MOV CS, BX löst natürlich eine invalid opcode exception aus (kann evtl sein, dass der originale 8086/80186 das mit sich machen lässt)
benutze stattdessen jmp far (oder retf oder call - dann muss nat. der stack zuerst vernünftig initialisiert sein); genaugenommen tut MOV BX, CS MOV CS, BX ja ohnehin nichts
über die code qualität an sich will ich hier nichts sagen - 16bit real mode ist sowieso hässlich, aber geht wohl nicht anders in diesem falle
im übrigen muss, wenn das ein disketten booten sein soll, der erste sektor anders gebaut sein, falls sie FAT lesbar sein soll (sonst ist es nat. egal)
-
1. gehöre ich zu den ASM-Anfängern
2. MOV BX, CS kann weggelassen werden (dort initialisiere ich CS und DS)
3. benutze ich NASM zum assemblieren
4. Habe ich den ersten Bootsektor richtig beschrieben (bei 7C00)