《自己动手写操作系统》,软盘没有,用U盘引导,大白菜MBR Boot启动512字节反汇编代码!

来源:互联网 发布:淘宝主营怎么修改 编辑:程序博客网 时间:2024/06/06 00:08

初始化部分

初始化寄存器环境

00007C60  31DB              xor bx,bx

00007C62  8EDB              mov ds,bx

00007C64  89DD              mov bp,bx

00007C66  8ED3              mov ss,bx

00007C68  BC007C            mov sp,0x7c00

00007C6B  06                push es

00007C6C  57                push di

 

读取扇区测试部分(最核心代码!!加载MBR使用,主要就是寄存器dl的设置,尽量不要对dl赋值)

各项寄存器设置可参考(INT13中断详解:功能02H)即可明白!!,然后你想读取U盘的哪块数据都

可以,默认将U盘当成硬盘操作,采用LBA硬盘读取模式!!

读取启动扇区(即1扇区)

00007C6D B80002            mov ax,0x200

00007C70 8EC0              mov es,ax

00007C72 40                inc ax

00007C73 B90100            mov cx,0x1

00007C76 89CE              mov si,cx

00007C78 30F6              xor dh,dh

00007C7A E81A01            call word 0x7d97


附:INT13中断详解:功能02H

功能描述:读扇区 

入口参数:AH=02H 

AL=扇区数 

CH=柱面 

CL=扇区 

DH=磁头 

DL=驱动器,00H~7FH:软盘;80H~0FFH:硬盘 

ES:BX=缓冲区的地址 

出口参数:CF=0——操作成功,AH=00H,AL=传输的扇区数,否则,AH=状态代码,参见功能号01H中的说明 



读取扇区测试

验证启动扇区的字符是否0x4246

00007C7D E86E00            call word 0x7cee

 

00007C80 8B3EAE21          mov di,[0x21ae]

00007C84 60                pushaw

00007C85 682002            push word 0x220

00007C88  803EAD2180        cmp byte [0x21ad],0x80

00007C8D  731F              jnc 0x7cae

 

00007C8F B441              mov ah,0x41

00007C91 BBAA55            mov bx,0x55aa

00007C94 CD13              int 0x13

 

00007C96  7216              jc 0x7cae

00007C98  81EB55AA          sub bx,0xaa55

00007C9C  7510              jnz 0x7cae

00007C9E  F6C101            test cl,0x1

00007CA1  740B              jz 0x7cae

00007CA3  58                pop ax

00007CA4  8EC0              mov es,ax

00007CA6  E87A00            call word 0x7d23

00007CA9  61                popaw

00007CAA  FECE              dec dh

00007CAC  EB1E              jmp short 0x7ccc

 

00007CAE  07                pop es

00007CAF  61                popaw

00007CB0  FEC6              inc dh

00007CB2  E8E200            call word 0x7d97

00007CB5  50                push ax

00007CB6  E82400            call word 0x7cdd

00007CB9  A2B021            mov [0x21b0],al

00007CBC  58                pop ax

00007CBD  86EE              xchg ch,dh

00007CBF  E8D500            call word 0x7d97

00007CC2  E81800            call word 0x7cdd

00007CC5  F636B021          div byte [0x21b0]

00007CC9  A2B121            mov [0x21b1],al

00007CCC  C60609213C        mov byte [0x2109],0x3c

00007CD1  A1B221            mov ax,[0x21b2]

00007CD4  40                inc ax

00007CD5  E84100            call word 0x7d19

00007CD8  EA9E230000        jmp word 0x0:0x239e

00007CDD  A1FE23            mov ax,[0x23fe]         ;0x7cdd

00007CE0  3D55AA            cmp ax,0xaa55

00007CE3  7506              jnz 0x7ceb

00007CE5  E80600            call word 0x7cee

00007CE8  A1AE23            mov ax,[0x23ae]

00007CEB  29F8              sub ax,di

00007CED  C3                ret                     ;

 

验证启动扇区的字符是否是0x4246

00007CEE 26813EB4014642    cmp word[es:0x1b4],0x4246  ;0x7cee

00007CF5 754F              jnz 0x7d46

00007CF7 C3                ret                         ;

 

 

00007CF8  60                pushaw                ;

00007CF9  31C0              xor ax,ax

00007CFB  CD13              int 0x13

00007CFD  61                popaw

00007CFE  3C07              cmp al,0x7

00007D00  7604              jna 0x7d06

00007D02  B007              mov al,0x7

00007D04  EB06              jmp short 0x7d0c

00007D06  3C01              cmp al,0x1

00007D08  76A5              jna 0x7caf

00007D0A  B001              mov al,0x1

00007D0C  80FEFF            cmp dh,0xff

00007D0F  7503              jnz 0x7d14

00007D11  884402            mov [si+0x2],al

00007D14  A2AD21            mov [0x21ad],al

00007D17  EB6D              jmp short 0x7d86

00007D19  29F8              sub ax,di

00007D1B  83DD00            sbb bp,byte +0x0

00007D1E  80FEFF            cmp dh,0xff

00007D21  7526              jnz 0x7d49

00007D23  89C1              mov cx,ax      ;0x7d23 start

00007D25  56                push si

00007D26  31C0              xor ax,ax

00007D28  50                push ax

00007D29  50                push ax

00007D2A  55                push bp

00007D2B  51                push cx

00007D2C  06                push es

00007D2D  53                push bx

00007D2E  A0AD21            mov al,[0x21ad]

00007D31  39F0              cmp ax,si

00007D33  7602              jna 0x7d37

00007D35  89F0              mov ax,si

00007D37  50                push ax

00007D38  6A10              push byte +0x10

00007D3A  89E6              mov si,sp

00007D3C  B442              mov ah,0x42

00007D3E  E84500            call word 0x7d86

00007D41  83C410            add sp,byte +0x10

00007D44  5E                pop si

00007D45  C3                ret               ;0x7d23 end

 

扇区读取测试失败跳转部分

00007D46 F4                hlt               ;待机

 

00007D47  EBFD              jmp short 0x7d46

00007D49  52                push dx

00007D4A  89EA              mov dx,bp

00007D4C  89C1              mov cx,ax

00007D4E  A0B021            mov al,[0x21b0]

00007D51  F626B121          mul byte [0x21b1]

00007D55  91                xchg ax,cx

00007D56  F7F1              div cx

00007D58  89C1              mov cx,ax

00007D5A  89D0              mov ax,dx

00007D5C  F636B021          div byte [0x21b0]

00007D60  5A                pop dx

00007D61  88C6              mov dh,al

00007D63  C0E506            shl ch,0x6

00007D66  08E5              or ch,ah

00007D68  86CD              xchg cl,ch

00007D6A  0FB606B021        movzx ax,[0x21b0]

00007D6F  28C8              sub al,cl

00007D71  243F              and al,0x3f

00007D73  3A06AD21          cmp al,[0x21ad]

00007D77  7603              jna 0x7d7c

00007D79  A0AD21            mov al,[0x21ad]

00007D7C  39F0              cmp ax,si

00007D7E  7602              jna 0x7d82

00007D80  89F0              mov ax,si

00007D82  B402              mov ah,0x2           ;****

00007D84  FEC1              inc cl

00007D86  E80700            call word 0x7d90

00007D89  0F826BFF          jc word 0x7cf8

00007D8D  30E4              xor ah,ah

00007D8F  C3                ret              ; ..

 

扇区读取子程序

00007D90 60                pushaw              ;0x7d90

00007D91 F9                stc

00007D92 CD13              int 0x13

00007D94 FB                sti

00007D95 61                popaw

00007D96 C3                ret                 ;

 

调用读取扇区子程序部分

00007D97 E8F6FF            call word0x7d90    ;0x7D97

00007D9A 72AA              jc 0x7d46

00007D9C C3                ret                 ;

 

00007D9D  0000              add [bx+si],al

00007D9F  0000              add [bx+si],al

00007DA1  0000              add [bx+si],al

00007DA3  0000              add [bx+si],al

00007DA5  0000              add [bx+si],al

00007DA7  0000              add [bx+si],al

00007DA9  0000              add [bx+si],al

00007DAB  0000              add [bx+si],al

00007DAD  3F                aas

00007DAE  0000              add [bx+si],al

00007DB0  3F                aas

00007DB1  FF                db 0xff

00007DB2  3F                aas

00007DB3  004642            add [bp+0x42],al

00007DB6  42                inc dx

00007DB7  46                inc si

00007DB8  0000              add [bx+si],al

00007DBA  0000              add [bx+si],al

00007DBC  0000              add [bx+si],al

00007DBE  80FE0C            cmp dh,0xc

00007DC1  330C              xor cx,[si]

00007DC3  50                push ax

00007DC4  65EB00            gs jmp short 0x7dc7

00007DC7  BF0C00            mov di,0xc

00007DCA  00B16B00          add [bx+di+0x6b],dh

00007DCE  0000              add [bx+si],al

00007DD0  0000              add [bx+si],al

00007DD2  0000              add [bx+si],al

00007DD4  0000              add [bx+si],al

00007DD6  0000              add [bx+si],al

00007DD8  0000              add [bx+si],al

00007DDA  0000              add [bx+si],al

00007DDC  0000              add [bx+si],al

00007DDE  0000              add [bx+si],al

00007DE0  0000              add [bx+si],al

00007DE2  0000              add [bx+si],al

00007DE4  0000              add [bx+si],al

00007DE6  0000              add [bx+si],al

00007DE8  0000              add [bx+si],al

00007DEA  0000              add [bx+si],al

00007DEC  0000              add [bx+si],al

00007DEE  0000              add [bx+si],al

00007DF0  0000              add [bx+si],al

00007DF2  0000              add [bx+si],al

00007DF4  0000              add [bx+si],al

00007DF6  0000              add [bx+si],al

00007DF8  0000              add [bx+si],al

00007DFA  0000              add [bx+si],al

00007DFC  0000              add [bx+si],al

00007DFE  55                push bp

00007DFF  AA                stosb

阅读全文
0 0