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 7C00h

    MOV 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, 0

    INT 13h
    JMP 0050h:0000h

    sector2:
    ORG 0000h

    MOV 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, 0

    INT 13h
    JMP 0052h:0000h

    sector3:
    ORG 0000h
    JMP start

    msg_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, 0

    MOV BX, 0052h
    MOV CS, BX
    MOV BX, CS
    MOV DS, BX

    MOV AH, 00h
    MOV AL, 03h
    INT 10h

    MOV AH, 06h
    MOV AL, 0
    MOV BH, 0
    MOV CX, 0
    MOV DH, 24
    MOV DL, 79
    INT 10h

    MOV 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 10h

    MOV AH, 0
    INT 16h

    JMP 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?


  • Mod

    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)


Anmelden zum Antworten