?? 硬盤主引導記錄.txt
字號:
; 入口參數:AH=功能號,02為讀盤操作;AL=一次讀取的扇區數
; ES:BX=讀入內存的起始地址
; CH=10位柱面號的低8位;CL:高兩位是10位柱面號的高兩位,低6位是物理扇區號
; DH=磁頭號;DL=驅動器號,最高位(即位7)為0是軟盤,為1是硬盤
0000:06A4 CD13 INT 13 ;讀分區引導記錄到0000:7C00起始的區域
;
;
0000:06A6 7229 JB 06D1 ;不成功轉
0000:06A8 BE2D07 MOV SI,072D ;錯誤信息字符串偏移→SI
0000:06AB 813EFE7D55AA CMP WORD PTR [7DFE],AA55 ;分區引導記錄合法嗎?
0000:06B1 745A JZ 070D ;合法則轉(這是主引導記錄唯一的正常出口)
0000:06B3 83EF05 SUB DI,+05 ;不合法則為換讀其他扇區做準備
0000:06B6 7FDA JG 0692 ;只有一次換讀扇區的機會!
;
; 0000:06B8~0000:06BF:錯誤預處理
0000:06B8 85F6 TEST SI,SI ;測試SI值是否為0,其意義在于確定該顯示哪條信息
0000:06BA 7583 JNZ 063F ;不為0則轉錯誤處理,顯示“Missing operating system”
0000:06BC BE1A07 MOV SI,071A ;錯誤信息字符串偏移→SI
0000:06BF EB8A JMP 064B ;轉錯誤處理,顯示“加載操作系統時出錯”
;
; 0000:06C1~0000:06CF:整理擴展讀所需入口參數,然后調用擴展讀子程序
; 這段代碼只有在以擴展讀方式讀取分區引導記錄時才有機會獲得執行
0000:06C1 98 CBW ;轉換字節AL為字AX,執行后,AX中是一次要讀的扇區數
0000:06C2 91 XCHG CX,AX ;AX→CX,CX→AX,執行后,CX中是一次要讀的扇區數
0000:06C3 52 PUSH DX ;
0000:06C4 99 CWD ;將字AX轉換為雙字→DX,AX
0000:06C5 034608 ADD AX,[BP+08] ;
0000:06C8 13560A ADC DX,[BP+0A] ;執行后,DX:AX=LBA絕對物理扇區號
0000:06CB E81200 CALL 06E0 ;調用擴展讀子程序
0000:06CE 5A POP DX ;
0000:06CF EBD5 JMP 06A6 ;
;
; 0000:06D1~0000:06D8分區引導記錄裝入失敗時的處理
0000:06D1 4F DEC DI ;計數器減1
0000:06D2 74E4 JZ 06B8 ;五次讀盤均未成功則轉錯誤處理(注意這時SI=0)
0000:06D4 33C0 XOR AX,AX ;置功能號
0000:06D6 CD13 INT 13 ;復位磁盤系統
0000:06D8 EBB8 JMP 0692 ;再讀
;
;
0000:06DA 00 00 80 49 12 00 ...I..
;
; 0000:06E0~0000:070C:使用擴展INT 13h功能讀取分區引導記錄的子程序
; 調用時,SP=7BFE。這段程序利用壓棧寄存器方式構造了一個磁盤地址包,請注意體會。另外,0000:06FC處
; 的一條指令就釋放了幾乎全部由本段程序占用的棧空間,構思之巧妙,絕對需要我們學習!
; 所以,分析該段程序,一個重點應放在棧的變化上。
0000:06E0 56 PUSH SI ;保存SI——注意,這次壓棧并不構造磁盤地址包
0000:06E1 33F6 XOR SI,SI ;清零
0000:06E3 56 PUSH SI ;
0000:06E4 56 PUSH SI ;
0000:06E5 52 PUSH DX ;
0000:06E6 50 PUSH AX ;以上四條指令壓棧的是扇區LBA號碼*2
0000:06E7 06 PUSH ES ;壓棧內存目標緩沖區首址段址
0000:06E8 53 PUSH BX ;壓棧內存目標緩沖區首址偏移
0000:06E9 51 PUSH CX ;壓棧所讀扇區數
0000:06EA BE1000 MOV SI,0010 ;注意SI的高8位對應著磁盤地址包的保留字節,必須為0
0000:06ED 56 PUSH SI ;壓棧磁盤地址包包長,執行完本條指令一個包已經構造完畢
0000:06EE 8BF4 MOV SI,SP ;規定磁盤地址包偏移指針,這時SP=7BEA
0000:06F0 50 PUSH AX ;保存AX
0000:06F1 52 PUSH DX ;保存DX
0000:06F2 B80042 MOV AX,4200 ;置擴展讀功能號
0000:06F5 8A5624 MOV DL,[BP+24] ;取驅動器號,參照0000:0683
; 入口參數:AH=功能號,02為讀盤操作;DL=驅動器號
; DS:SI=16字節磁盤地址包——第0字節:包長度(固定為10h);第1字節:保留,必須為0;
; 第2、3字節:所讀扇區數;第4~5字節:內存目標緩沖區首址偏移;
; 第6~7字節:內存目標緩沖區首址段址; 第8~15字節:扇區LBA號碼
; 出口參數:成功則AH=0;錯誤則AH=錯誤代碼
0000:06F8 CD13 INT 13 ;執行擴展讀操作
0000:06FA 5A POP DX ;
0000:06FB 58 POP AX ;
0000:06FC 8D6410 LEA SP,[SI+10] ;7BEA+10h=7BFA→SP(注意是取偏移而不是取單元內容)
0000:06FF 720A JB 070B ;擴展讀不成功轉
0000:0701 40 INC AX ;
0000:0702 7501 JNZ 0705 ;
0000:0704 42 INC DX ;AX加1溢出時(比如0FFFFh+1)DX才加1
0000:0705 80C702 ADD BH,02 ;調整BX,使偏移量增加512字節(剛好一扇區)
0000:0708 E2F7 LOOP 0701 ;0701~0708一段代碼暫未明白其真實意圖!
0000:070A F8 CLC ;
0000:070B 5E POP SI ;
0000:070C C3 RET ;
;
; 0000:070D:中繼跳轉
0000:070D EB74 JMP 0783 ;
;
; 070F~0745是錯誤信息!果然是中文Windows98生成的主引導記錄,所以我要特別
; “感謝”微軟這個傻B,真難為它竟然用中文表述前兩個信息!可惜真需顯示的時
; 候鬼才能看懂是什么呢!!!我K!——耍弄我們耶!?
; 070F~0718:“分區表無效”中文信息
; 071A~072B:“加載操作系統時出錯”中文信息
; 072D~0744:“Missing operating system”英文信息
0000:070F B7 .
0000:0710 D6 C7 F8 B1 ED CE DE D0-A7 00 BC D3 D4 D8 B2 D9 ................
0000:0720 D7 F7 CF B5 CD B3 CA B1-B3 F6 B4 ED 00 4D 69 73 .............Mis
0000:0730 73 69 6E 67 20 6F 70 65-72 61 74 69 6E 67 20 73 sing operating s
0000:0740 79 73 74 65 6D 00 00 00-00 00 00 00 00 00 00 00 system..........
0000:0750 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0760 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0770 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0780 00 00 00 ...
;
; 0000:0783~0000:0789:控制權移交
0000:0783 8BFC MOV DI,SP ;
0000:0785 1E PUSH DS ;
0000:0786 57 PUSH DI ;構造一個跳轉地址
0000:0787 8BF5 MOV SI,BP ;
0000:0789 CB RETF ;交控制權給分區引導記錄(0000:7C00)
;
;
0000:078A 00 00 00 00 00 00 ......
0000:0790 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:07A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
;
; 07B8~07BB四個字節的內容用于什么呢?(不同機器此四字節均不同)
; 07BE~07FD為分區表,內含四個分區表項(每表項10h字節)
0000:07B0 00 00 00 00 00 00 00 00-86 D8 00 00 00 00 80 01 ................
0000:07C0 01 00 06 3F 3F FD 3F 00-00 00 41 A0 0F 00 00 00 ...??.?...A.....
0000:07D0 01 FE 05 3F FF FE 80 A0-0F 00 C0 4F 2F 00 00 00 ...?.......O/...
0000:07E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:07F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..............U.
*1:因為物理扇區號總是從1排列而起
*2:由此可見,就是使用LBA擴展讀的功能,主引導記錄卻限制了分區引導扇區必須在LBA絕對物理扇區
0FFFFFFFFh之前才有可能從該分區引導系統!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -