Egy standard MBR (Master Boot Record) assembly listája


; Standard MBR = Master Boot Record
;
; Ezt az 512 byte-ot (a partíciós tábla adatait leszámítva)
; az MS-DOS v6.22 FDISK parancsa írja be a 0-as drive t0h0s1-ébe
; egy FDISK /MBR parancs hatására.

; A BIOS a POST végrehajtása után a track 0, head 0, sector 1-en
; találhato 512 byte méretű Master Boot Record-ot betölti 0000:7C00-ra,
; majd átadja rá a vezérlést. A kód elôször átmásolja magát 0000:0600-ra,
; mert a boot-olható partíció boot-szektorának kell a hely 0000:7C00-án:

7C00 FA            CLI
7C01 33C0          XOR	AX,AX
7C03 8ED0          MOV	SS,AX
7C05 BC007C        MOV	SP,7C00		; verem 7C00-tol lefelé
7C08 8BF4          MOV	SI,SP		; másolás 0000:7C00-rol...
7C0A 50            PUSH	AX
7C0B 07            POP	ES
7C0C 50            PUSH	AX
7C0D 1F            POP	DS
7C0E FB            STI
7C0F FC            CLD
7C10 BF0006        MOV	DI,0600		; ... 0000:0600-ra...
7C13 B90001        MOV	CX,0100		; 512 byte-ot (256 word)
7C16 F2            REPNZ
7C17 A5            MOVSW
7C18 EA1D060000    JMP	0000:061D

; Ami itt következik, az eredetileg 0000:7C1D-tôl volt, de a fenti rutin
; átmásolja az egészet 061D-re, es ott futtatja. A címeket átírtam az
; új pozíciónak megfelelôen.

; Az itt következô részlet a 4 partíció-bejegyzés közül megkeresi az
; elsô boot-olható partíciót, illetve ellenôrzi, hogy elôtte csak "inactive"
; partíciók vannak-e (00-as kódú):

061D BEBE07        MOV	SI,07BE		; -> partíciós tábla
0620 B304          MOV	BL,04		; max. négy bejegyzés lehet
0622 803C80        CMP	BYTE PTR [SI],80; boot-olható a partíció?
0625 740E          JZ	0635
0627 803C00        CMP	BYTE PTR [SI],00; 00-n és 80-on kívül más nem lehet
062A 751C          JNZ	0648		; -> "Invalid partition table"
062C 83C610        ADD	SI,+10		; lássuk a következô bejegyzést...
062F FECB          DEC	BL
0631 75EF          JNZ	0622		; ha még nem néztük végig, vissza
0633 CD18          INT	18		; egyik partíció sem volt bootolható,
					; -> a ROM-BASIC indítása

; A következôkben leteszteljük az egyetlen boot-olható partíció
; utáni bejegyzéseket is (csak 00-as kódúak lehetnek):

0635 8B14          MOV	DX,[SI]		; drive/head
0637 8B4C02        MOV	CX,[SI+02]	; cylinder/sector
063A 8BEE          MOV	BP,SI		; bejegyzés offsetjének mentése
063C 83C610        ADD	SI,+10		; lássuk a többi partíciót...
063F FECB          DEC	BL		; ez volt az utolsó?
0641 741A          JZ	065D		; -> boot
0643 803C00        CMP	BYTE PTR [SI],00; a többiben mind 00-nak kell lenni
0646 74F4          JZ	063C

; Ez itt a hibakiíró rutin. Miután kiírta az SI offseten lévô,
; 0-val lezárt szöveget (ASCIIZ), végtelen ciklusba jut:

0648 BE8B06        MOV	SI,068B		; -> "Invalid partition table"
064B AC            LODSB
064C 3C00          CMP	AL,00
064E 740B          JZ	065B
0650 56            PUSH	SI
0651 BB0700        MOV	BX,0007
0654 B40E          MOV	AH,0E
0656 CD10          INT	10		; AL-ben lévô karakter kiírása
0658 5E            POP	SI
0659 EBF0          JMP	064B
065B EBFE          JMP	065B		; press reset to continue...

; Betöltjük az "active" (boot-olható) partíciós tábla elsô szektorát.
; A partíciós tábla-bejegyzések elsô két word-je megadja a boot-szektor
; pozícióját (elsô word: drive/head, második word: cylinder/sector),
; ezeket az elôbb már be is töltöttük a megfelelô (azaz INT13 által
; elvárt) regiszterekbe.

065D BF0500        MOV	DI,0005		; 5-ször próbálkozunk
0660 BB007C        MOV	BX,7C00		; 0000:7C00-ra töltjük a bootszektort
0663 B80102        MOV	AX,0201		; read 1 sector
0666 57            PUSH	DI
0667 CD13          INT	13
0669 5F            POP	DI
066A 730C          JNB	0678		; ha nem volt hiba (CF=0), tovább
066C 33C0          XOR	AX,AX		; különben...
066E CD13          INT	13		; ...reset drive
0670 4F            DEC	DI
0671 75ED          JNZ	0660
0673 BEA306        MOV	SI,06A3		; -> "Error loading operating system"
0676 EBD3          JMP	064B

; Bent van a tárban a boot-szektor, már csak le kell ellenôrizni, hogy
; érvényes-e (az 510-es offseten az 55,AA byte-oknak kell szerepelni):

0678 BEC206        MOV	SI,06C2
067B BFFE7D        MOV	DI,7DFE		; boot szektor 510-es offsetje
067E 813D55AA      CMP	WORD PTR [DI],AA55	; signature check
0682 75C7          JNZ	064B	; nincs ott? -> "Missing operating system"
0684 8BF5          MOV	SI,BP	; SI = BP = partícióstábla bejegyzés offsetje
0686 EA007C0000    JMP	0000:7C00	; ugrás a boot-partíció bootszektorára

0680                                   49 6E 76 61 6C              Inval
0690  69 64 20 70 61 72 74 69-74 69 6F 6E 20 74 61 62   id partition tab
06A0  6C 65 00 45 72 72 6F 72-20 6C 6F 61 64 69 6E 67   le.Error loading
06B0  20 6F 70 65 72 61 74 69-6E 67 20 73 79 73 74 65    operating syste
06C0  6D 00 4D 69 73 73 69 6E-67 20 6F 70 65 72 61 74   m.Missing operat
06D0  69 6E 67 20 73 79 73 74-65 6D 00                  ing system.

; Végül egy lehetséges partíciós tábla:

07B0                                            80 01                 ..
07C0  01 00 06 3F 3F C4 3F 00-00 00 81 1E 0C 00 00 00   ...??.?.........
07D0  01 C5 05 3F 7F 47 C0 1E-0C 00 40 0F 08 00 00 00   ...?.G....@.....
07E0  41 48 82 3F 7F 53 00 2E-14 00 00 BD 00 00 00 00   AH.?.S..........
07F0  41 54 83 3F BF 0F 00 EB-14 00 00 91 0B 00 55 AA   AT.?..........U.

; Megjegyzés:
;
; A partíciós tábla végére is kell egy 55,AA signature, mert ha nincs,
; a BIOS kiírja, hogy "Drive not ready" vagy valami hasonlót.