| 比较详细的MBR的分析 |
 |
作者: 来源: 日期:2007-5-17 11:17:11 点击次数: |
|
; 调用时,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 ; 上一篇:扩展int13h调用详解(修正) 下一篇:自己编程实现多引导 |
|
|
 |
| 北京总部: 4006-505-808 |
| 上 海 部: 021-58358765 |
| 深 圳 部: 0755-83692929 |
| 浙 江 部: 13666673722 |
| 广 州 部: 020-83821091 |
| 重 庆 部: 023-86870422 |
| 昆 明 部: 15987117834 |
| 哈尔滨部: 13946167430 |
| 其它地区: 4006-505-808 | | | |
|
 |
|