00000067 66FF7608 push dword [bp+0x8]
0000006B 680000 push word 0x0
0000006E 68007C push word 0x7c00 /* 传输缓冲区地址 */
00000071 680100 push word 0x1 /* 读取扇区的个数 */
00000074 681000 push word 0x10 /* 数据包尺寸一般是/ 16字节 */
00000077 B442 mov ah,0x42 /* 读磁盘 */
00000079 8A5600 mov dl,[bp+0x0] /* 驱动器号 */
0000007C 8BF4 mov si,sp /* buffer_packet 的 address */
0000007E CD13 int 0x13
00000080 9F lahf
00000081 83C410 add sp,byte +0x10
00000084 9E sahf
00000085 EB14 jmp short 0x9b /* 跳转到原int 13 之后 */
/* 使用 int 0x13 原有功能来读取磁盘 */
/* ah= 0x2 功能读 al=0x1 读一个扇区*/
00000087 B80102 mov ax,0x201
0000008A BB007C mov bx,0x7c00 /* es:bx = buffer */
0000008D 8A5600 mov dl,[bp+0x0] /* hard disk */
00000090 8A7601 mov dh,[bp+0x1] /* 从哪个 head 开始读 */
00000093 8A4E02 mov cl,[bp+0x2] /* 从哪个 sector 开始读 */
/* 其中低 6 bits 是 sector,高2位是cylinder */
00000096 8A6E03 mov ch,[bp+0x3] /* 从哪个 cylinder 开始读 */
00000099 CD13 int 0x13
/* 活动分区已经找到,并且读取了活动分区的第一个分区表记录到 0x7c00 */
0000009B 6661 popad /* 通用寄存器出栈 */
0000009D 731C jnc 0xbb /* 读取成功则跳转 */
0000009F FE4E11 dec byte [bp+0x11] /* 5-1 ,通过这个变量来完成五次对磁盘的读 */
000000A2 750C jnz 0xb0 /* 不等于0 就继续*/
/* 读完五次后 ,还找不到活动分区就输出错误信息*/
000000A4 807E0080 cmp byte [bp+0x0],0x80
000000A8 0F848A00 jz word 0x136
/* 找到则去读取分区表记录信息 */
000000AC B280 mov dl,0x80
000000AE EB84 jmp short 0x34 /* 读信息 */
000000B0 55 push bp /**/
000000B1 32E4 xor ah,ah
000000B3 8A5600 mov dl,[bp+0x0]
000000B6 CD13 int 0x13
000000B8 5D pop bp
000000B9 EB9E jmp short 0x59
/*
*代码中再次核对,是否 55aa 标志,如果不是将打印出错信息后 hlt
*代码中还将测试键盘读/写缓冲区,然后往键盘端口 0x60 写命令字。
*call word 0x156 这个子过程就是测试读/写缓冲区过程。
*代码最终将转去 0x127 执行
*/
000000BB 813EFE7D55AA cmp word [0x7dfe],0xaa55
000000C1 756E jnz 0x131 /* 不是,打印错信息,hlt */
000000C3 FF7600 push word [bp+0x0]
000000C6 E88D00 call word 0x156 /* 从 64H 读 1 byte */
000000C9 7517 jnz 0xe2 /* 缓冲区满,不能写*/
000000CB FA cli
000000CC B0D1 mov al,0xd1
000000CE E664 out 0x64,al
000000D0 E88300 call word 0x156
000000D3 B0DF mov al,0xdf
000000D5 E660 out 0x60,al
000000D7 E87C00 call word 0x156
000000DA B0FF mov al,0xff
000000DC E664 out 0x64,al
000000DE E87500 call word 0x156
000000E1 FB sti
000000E2 B800BB mov ax,0xbb00
000000E5 CD1A int 0x1a
000000E7 6623C0 and eax,eax
000000EA 753B jnz 0x127
000000EC 6681FB54435041 cmp ebx,0x41504354
000000F3 7532 jnz 0x127
000000F5 81F90201 cmp cx,0x102
000000F9 722C jc 0x127
/*
* 不明白 int 0x1a 中断的
*/
000000FB 666807BB0000 push dword 0xbb07
00000101 666800020000 push dword 0x200
00000107 666808000000 push dword 0x8
0000010D 6653 push ebx
0000010F 6653 push ebx
00000111 6655 push ebp
00000113 666800000000 push dword 0x0
00000119 6668007C0000 push dword 0x7c00
0000011F 6661 popad
00000121 680000 push word 0x0
00000124 07 pop es
00000125 CD1A int 0x1a
/*
* 代码最终回到0x7c00 ,继续执行从活动分区的第一个扇区拷贝的代码
*/
00000127 5A pop dx
00000128 32F6 xor dh,dh
0000012A EA007C0000 jmp word 0x0:0x7c00
0000012F CD18 int 0x18 /* 不明白 */
/* 打印出错信息,hlt */
00000131 A0B707 mov al,[0x7b7] /* 索引号为 9A */
00000134 EB08 jmp short 0x13e
00000136 A0B607 mov al,[0x7b6] /* 索引号为 7B */
00000139 EB03 jmp short 0x13e
0000013B A0B507 mov al,[0x7b5] /* 索引号为 63 */
0000013E 32E4 xor ah,ah
00000140 050007 add ax,0x700
00000143 8BF0 mov si,ax
00000145 AC lodsb
00000146 3C00 cmp al,0x0
00000148 7409 jz 0x153
0000014A BB0700 mov bx,0x7
0000014D B40E mov ah,0xe
0000014F CD10 int 0x10
00000151 EBF2 jmp short 0x145
00000153 F4 hlt
00000154 EBFD jmp short 0x153
00000156 2BC9 sub cx,cx
00000158 E464 in al,0x64
0000015A EB00 jmp short 0x15c
0000015C 2402 and al,0x2
0000015E E0F8 loopne 0x158
00000160 2402 and al,0x2
00000162 C3 ret
/********** 下面的区域是 mbr 常量符: mbr_str **************/
/*
* 163----1b2
char *mbr_str = "Invalid partition table."
"Error loading operation system."
"Missing operation system."
*/
00000163 49 dec cx
00000164 6E outsb
00000165 7661 jna 0x1c8
00000167 6C insb
00000168 6964207061 imul sp,[si+0x20],word 0x6170
0000016D 7274 jc 0x1e3
0000016F 6974696F6E imul si,[si+0x69],word 0x6e6f
00000174 207461 and [si+0x61],dh
00000177 626C65 bound bp,[si+0x65]
0000017A 004572 add [di+0x72],al
0000017D 726F jc 0x1ee
0000017F 7220 jc 0x1a1
00000181 6C insb
00000182 6F outsw
00000183 61 popaw
00000184 64696E67206F imul bp,[fs:bp+0x67],word 0x6f20
0000018A 7065 jo 0x1f1
0000018C 7261 jc 0x1ef
0000018E 7469 jz 0x1f9
00000190 6E outsb
00000191 67207379 and [ebx+0x79],dh
00000195 7374 jnc 0x20b
00000197 656D gs insw
00000199 004D69 add [di+0x69],cl
0000019C 7373 jnc 0x211
0000019E 696E67206F imul bp,[bp+0x67],word 0x6f20
000001A3 7065 jo 0x20a
000001A5 7261 jc 0x208
000001A7 7469 jz 0x212
000001A9 6E outsb
000001AA 67207379 and [ebx+0x79],dh
000001AE 7374 jnc 0x224
000001B0 656D gs insw
/*
* 下面是字符串索引值
* 在出错处理过程里,根据索引值找到相应的出错信息
* 然后使用 int 0x10 打印出错信息,最后是 hlt 停机指令。
*/
000001B2 0000 add [bx+si],al
000001B4 00637B add [bp+di+0x7b],ah
000001B7 9A81D6EF4A call word 0x4aef:0xd681
000001BC 0101 add [bx+di],ax
/*
下面是磁盘分区表 64byte
*/
000001BE 802021 and byte [bx+si],0x21
000001C1 0007 add [bx],al
000001C3 FE db 0xfe
000001C4 FF db 0xff
000001C5 FF00 inc word [bx+si]
000001C7 0800 or [bx+si],al
000001C9 0000 add [bx+si],al
000001CB B060 mov al,0x60
000001CD 07 pop es
000001CE 00FE add dh,bh
000001D0 FF db 0xff
000001D1 FF07 inc word [bx]
000001D3 FE db 0xfe
000001D4 FF db 0xff
000001D5 FF00 inc word [bx+si]
000001D7 B86007 mov ax,0x760
000001DA 0038 add [bx+si],bh
000001DC 1F pop ds
000001DD 0000 add [bx+si],al
000001DF 0000 add [bx+si],al
000001E1 0000 add [bx+si],al
000001E3 0000 add [bx+si],al
000001E5 0000 add [bx+si],al
000001E7 0000 add [bx+si],al
000001E9 0000 add [bx+si],al
000001EB 0000 add [bx+si],al
000001ED 0000 add [bx+si],al
000001EF 0000 add [bx+si],al
000001F1 0000 add [bx+si],al
000001F3 0000 add [bx+si],al
000001F5 0000 add [bx+si],al
000001F7 0000 add [bx+si],al
000001F9 0000 add [bx+si],al
000001FB 0000 add [bx+si],al
000001FD 0055AA add [di-0x56],dl
0x56u