// Per vedere il MBR scrivere quanto segue al prompt del DOS // debug -a 100 1B70:0100 mov ax,cs 1B70:0102 mov es,ax 1B70:0104 mov bx,200 1B70:0107 mov ax,201 1B70:010A mov cx,1 1B70:010D mov dx,80 1B70:0110 int 13 1B70:0112 nop 1B70:0113 ret 1B70:0114 -g=100 113 AX=0050 BX=0200 CX=0001 DX=0080 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1B70 ES=1B70 SS=1B70 CS=1B70 IP=0113 NV UP EI PL NZ NA PO NC 1B70:0113 C3 RET -u 200 31f // Il MBS viene automaticamente caricato in 0:7C00 allora // la prima cosa che fa e' copiarsi in 0:61B 1B70:0200 33C0 XOR AX,AX //AX=0 1B70:0202 8ED0 MOV SS,AX //SS=0 1B70:0204 BC007C MOV SP,7C00 //SP=7C00 1B70:0207 FB STI //Abilita gli interrupt 1B70:0208 50 PUSH AX // 1B70:0209 07 POP ES //ES=AX=0 1B70:020A 50 PUSH AX // 1B70:020B 1F POP DS //DS=AX=0 1B70:020C FC CLD //SI e DI in avanti (+) 1B70:020D BE1B7C MOV SI,7C1B // 1B70:0210 BF1B06 MOV DI,061B //Copia da 7C1B in 061B 1B70:0213 50 PUSH AX // CX=01E5 bytes 1B70:0214 57 PUSH DI // 1B70:0215 B9E501 MOV CX,01E5 // Salva nello stak 1B70:0218 F3 REPZ // il puntatore (RETF) 1B70:0219 A4 MOVSB // 1B70:021A CB RETF //Salta al pt nello stack // Questa parte viene eseguita a partire dalla locazione 0:61B // verifica la presenza di una ed una sola partizione avviablie // Codice di BOOT <0 (80H..) == Drive // Se non c'e' o ce ne sono piu' di una allora 1B70:021B BEBE07 MOV SI,07BE //SI=07BE ->Prima partizione 1B70:021E B104 MOV CL,04 //CL=4 e CH=0 (Da prima) 1B70:0220 382C CMP [SI],CH //Il codice BOOT e' ... 1B70:0222 7C09 JL 022D //.. minore di 0 (80H) -> 22D 1B70:0224 7515 JNZ 023B //.. maggiore di 0 -> 23B 1B70:0226 83C610 ADD SI,+10 //.. ==0 allora 1B70:0229 E2F5 LOOP 0220 // prova le altre partizioni. 1B70:022B CD18 INT 18 //e se sono tutte vuote INT 18 //reboot o blocco comunque (FINE) // Dopo aver trovato la partizione di boot // (Salva DX=Codice Boot e BP l'offset del codice di BOOT) // controlla che non ce ne sia un'altra altrimenti errore 1B70:022D 8B14 MOV DX,[SI] //DX=Codice di BOOT=Drive=DX INT13/2 1B70:022F 8BEE MOV BP,SI //BP=SI offset del codice di BOOT 1B70:0231 83C610 ADD SI,+10 //Punta alla prossima partizoine 1B70:0234 49 DEC CX // 1B70:0235 7416 JZ 024D //Se le ha fatte tutte va 024D 1B70:0237 382C CMP [SI],CH // 1B70:0239 74F6 JZ 0231 //Se il codice BOOT==0 continua // Segnala un errore e si blocca ha trovato piu' di una partizione o un codice // di BOOT irregolare (Maggiore di 0 (01..7F)) 1B70:023B BE1007 MOV SI,0710 //segnala un'errore 1B70:023E 4E DEC SI //Carica il messaggio in 070FH 1B70:023F AC LODSB // e lo scrive un byte per volta 1B70:0240 3C00 CMP AL,00 // 1B70:0242 74FA JZ 023E // e si blocca. 1B70:0244 BB0700 MOV BX,0007 // 1B70:0247 B40E MOV AH,0E //"Tabella delle partizioni non valida" 1B70:0249 CD10 INT 10 // 1B70:024B EBF2 JMP 023F //Scrive il prossimo carattere // La partizione d'avvio è stata torovata allora // Legge le informazioni sul sistema e carica il BS in 0:7C00 ed // infine lo esegue in 0:7C00 // Situazione: SS=0 SP=7C00 // DX=(LSB)Codice di Boot + (MSB)N. di testine = DX per INT13/2 // BP=Offset del codice di boot (Quello che parte da 0600H) // DS=ES=0; // CS=0 IP=064D 1B70:024D 894625 MOV [BP+25],AX //AX=0 1B70:0250 96 XCHG SI,AX //SI=0 1B70:0251 8A4604 MOV AL,[BP+04] //AL=Codice di SYS 1B70:0254 B406 MOV AH,06 //AH=06 1B70:0256 3C0E CMP AL,0E //Cod SYS == 0E () 1B70:0258 7411 JZ 026B // allora vai 026B 1B70:025A B40B MOV AH,0B //AH=0B 1B70:025C 3C0C CMP AL,0C // == 0C () 1B70:025E 7405 JZ 0265 // allora vai 0265 1B70:0260 3AC4 CMP AL,AH // == (AH=0B) 1B70:0262 752B JNZ 028F //se non e' uguale vai a028F 1B70:0264 40 INC AX //altrimenti AX=0B0C 1B70:0265 C6462506 MOV BYTE PTR [BP+25],06 //BP+25=06 1B70:0269 7524 JNZ 028F //Vai 028F 1B70:026B BBAA55 MOV BX,55AA // 1B70:026E 50 PUSH AX // 1B70:026F B441 MOV AH,41 // 1B70:0271 CD13 INT 13 //Esegue qualche cosa ??? 1B70:0273 58 POP AX //preleva il vecchio AX 1B70:0274 7216 JB 028C 1B70:0276 81FB55AA CMP BX,AA55 1B70:027A 7510 JNZ 028C 1B70:027C F6C101 TEST CL,01 1B70:027F 740B JZ 028C 1B70:0281 8AE0 MOV AH,AL 1B70:0283 885624 MOV [BP+24],DL 1B70:0286 C706A106EB1E MOV WORD PTR [06A1],1EEB 1B70:028C 886604 MOV [BP+04],AH 1B70:028F BF0A00 MOV DI,000A 1B70:0292 B80102 MOV AX,0201 //Legge un settore (BS) 1B70:0295 8BDC MOV BX,SP //BX=7C00 ed ES=0 e DX gia' settato 1B70:0297 33C9 XOR CX,CX //Azzera CX 1B70:0299 83FF05 CMP DI,+05 1B70:029C 7F03 JG 02A1 1B70:029E 8B4E25 MOV CX,[BP+25] 1B70:02A1 034E02 ADD CX,[BP+02] //Sett+MSBCyl della partizione -> Ok 1B70:02A4 CD13 INT 13 1B70:02A6 7229 JB 02D1 //Errore di lettura allora vai a 02D1 1B70:02A8 BE6707 MOV SI,0767 //Msg errore "Manca il sistema operativo" 1B70:02AB 813EFE7D55AA CMP WORD PTR [7DFE],AA55 //Controlla di aver letto il BS 1B70:02B1 745A JZ 030D //Se si allora avvia il BS 1B70:02B3 83EF05 SUB DI,+05 //altrimenti prova con un altro settore 1B70:02B6 7FDA JG 0292 1B70:02B8 85F6 TEST SI,SI 1B70:02BA 7583 JNZ 023F //Errore "Manca il sistema operativo" 1B70:02BC BE3307 MOV SI,0733 1B70:02BF EB8A JMP 024B //Errore "Errore durante il caricamento del SO" .... . . . . . . .... . . . . . . .... . . . . . . .... . . . . . . .... . . . . . . 1B70:0304 42 INC DX 1B70:0305 80C702 ADD BH,02 1B70:0308 E2F7 LOOP 0301 1B70:030A F8 CLC 1B70:030B 5E POP SI 1B70:030C C3 RET 1B70:030D EB74 JMP 0383 //Esegue il BS -u 383 400 1B70:0383 8BFC MOV DI,SP 1B70:0385 1E PUSH DS 1B70:0386 57 PUSH DI //0:7C00 posizione del BS 1B70:0387 8BF5 MOV SI,BP //Passa al BS SI=BP offset del 1B70:0389 CB RETF // BOOT della partizione ed esegue il BS -q