Emulator & Bootloader fürs Arbeiten

da-breez
Hi,

Ich hab alle diese Bootloader ausprobiert, aber in wirklichkeit ist keiner genau der den ich haben will. er soll einfach ein x86 cpu simulieren, da ich keinen pc habe um die bootloader usw zu testen und nicht immer mein system neustarten will.

http://www.wikiservice.at/dse/wiki.cgi?VirtualMachine

der bootloader ist hier, ich versteh ihn nicht so ganz könnte mir den jemmand zeile für zeile erklären ? wäre schön wenn sich da paar leute finden könnten:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
org 0x7C00 ; Unsere Startadresse
 
         ; -----------------------------------------
         ; Unser Bootloader
         ; -----------------------------------------
 
         start:
                         ; Erst brauchen wir einen Stack.
         cli             ; Keine Interrupts!
         mov ax, 0x9000  ; Stackadresse
         mov ss, ax      ; SS = 9000 (unser Stack)
         mov sp, 0       ; SP = 0000  (der Stackpointer)
         sti             ; Interrupts zulassen
 
         ; Bootlaufwerk aus DL speichern
         mov [bootdrv], dl
 
         ;Lade unseren Kernel
         call load
 
         ;Springe zu diesem Kernel
         mov ax, 0x1000 ; Die Adresse des Programms
         mov es, ax     ; Segmentregister updaten
         mov ds, ax
         push ax
         mov ax, 0
         push ax
         retf
 
         ; ----------------------------------------------
         ; Funktionen und Variablen
         ; ----------------------------------------------
 
         bootdrv db 0 ;Das Bootlaufwerk
         loadmsg db "Loading...",13,10,0
 
         ; Einen String ausgeben:
         putstr:
         lodsb             ; Byte laden
         or al,al
         jz short putstrd  ; 0-Byte? -> Ende!
 
         mov ah,0x0E       ; Funktion 0x0E
         mov bx,0x0007     ; Attribut-Byte (wird nicht benötigt)
         int 0x10          ; schreiben
         jmp putstr        ; Nächstes Byte
         putstrd:
         retn
 
         ; Lade den Kernel vom Bootlaufwerk
         load:
 
         ; Diskdrive reset (Interrupt 13h, 0)
         push ds            ; Sichere DS
         mov ax, 0          ; Die gewünschte Funktion (reset)
         mov dl, [bootdrv]  ; Dieses Laufwerk ist gewünscht
         int 13h            ; Den Interrupt ausführen
         pop ds             ; DS wiederherstellen
         jc load            ; Geht nicht? -> Noch mal!
 
         load1:
         mov ax,0x1000      ; ES:BX = 10000
         mov es,ax
         mov bx, 0
 
         ; Sektoren lesen (Interrupt 13h, 2)
         mov ah, 2       ; Funktion 2 (Lesen)
         mov al, 5       ; Lese 5 Sektoren
         mov cx, 2       ; Cylinder=0, Sector=2
         mov dx, 0       ; Head=0, Laufwerk=0
         int 13h         ; ES:BX =  Daten vom Laufwerk
         jc load1        ; Fehler? Noch mal!
         mov si,loadmsg
         call putstr     ; Meldung ausgeben
         retn
 
         times 512-($-$$)-2 db 0   ; Dateilänge: 512 Bytes
         dw 0AA55h                 ; Bootsignatur


mfg
Da-Breez
memorYoverflow
denkst du wirklich jemand wird dir hier alles stück für stück erklähren..?!

geh mal auf lowlevel.net.tc!!!
da-breez
sagen wir es mal so,
ich hoffe es, weil lowlevel down ist momentan ....
memorYoverflow
jo ich weiss dass des down is, aber nich mehr lange...

besser wäre es wenn du konkret ein paar fragen stellen würdest...
ich könnte versuche diese zu beantworten....
aber den ganzen code-> mom kein bock...
da-breez
naja ich würde gerne wissen, wieso man das jetzt so und so macht, also z.b. die stacks benutzt.
im prinzip wie ich mich da ran setze und welches muster ich zu befolgen habe.