boot引导程序 收藏 org 07c00h boot: jmp begine nop BS_OEMName db 'cty1234' BPB_BytsPerSec dw 512 BPB_SecPerClus db 1 BPB_RsvdSecCnt dw 1 BPB_NumFATs db 2 BPB_RootEntCnt dw 224 BPB_TotSec16 dw 2880 BPB_Media db 0F0h BPB_FAT16 dw 9 BPB_SecPerTrk dw 18 ; 每磁道扇区数 BPB_NumHeads dw 2 ; 磁头数(面数) BPB_HiddSec dd 0 ; 隐藏扇区数 BPB_TotSec32 dd 0 ; 如果 wTotalSectorCount 是 0 由这个值记录扇区数 BS_DrvNum db 0 ; 中断 13 的驱动器号 BS_Reserved1 db 0 ; 未使用 BS_BootSig db 29h ; 扩展引导标记 (29h) BS_VolID dd 0 ; 卷序列号 BS_VolLab db 'evilbinary '; 卷标, 必须 11 个字节 BS_FileSysType db 'FAT12 ' INITOFS dw 1000h INITSEG dw 9000h FATOFS dw 0000h FATSEG dw 9000h fatnum dw 9 sectnum dw 19 sectnum1 db 1 fatnumcount dw 1 fatentry dw 200h filename db 'SETUP BIN' bootm: db "Bootting" nofound: db "No setup file." ready: db "Ready." begine: mov ax,cs mov ds,ax mov ss,ax mov es,ax mov sp,ax mov ax, 0600h mov bx, 0700h mov cx, 0 mov dx, 0184fh int 10h mov ax,0200h xor dx,dx mov bx,0 int 10h xor ax,ax ;复位 xor dx,dx int 13h mov cx,8 mov si,bootm call print_string nof: mov ax,[sectnum] ;mov ax,21 cmp ax,32 ja fail mov di,[FATOFS] mov es,[FATSEG] call read_sect call search_file inc word [sectnum] cmp ax,-1 je nof ;ax=file first sector fatread: push ax mov es,[INITSEG] mov di,[INITOFS] add ax,31 call read_sect pop ax add word[INITOFS],200h mov bx,[INITOFS] push ax mov al,'.' call print_char pop ax call get_entry cmp ax,0ff8h jae fatreadend jmp fatread fatreadend: call print_newline mov cx,6 mov si,ready call print_string call print_newline jmp 0x9000:0x1000 fail: call print_newline mov cx,14 mov si,nofound call print_string jmp $ ;int 3h ;ax=sector es:di=fat men addr get_entry: push bx push cx push dx push es push di mov bx,3 mul bx mov bx,2 div bx a: cmp ax,[fatentry] ;first time=200h jbe next mov es,[FATSEG] mov di,[FATOFS] push ax mov ax,[fatnumcount] cmp ax,9 ja endread ;fat 9 项 call read_sect pop ax inc word[fatnumcount] add word[fatentry],200h ;200h jmp a next: push ax mov es,[FATSEG] mov di,[FATOFS] mov ax,[fatnumcount] call read_sect pop ax add ax,200h sub ax,[fatentry] add di,ax mov ax,[es:di] cmp dx,0 je even1 mov cl,4 shr ax,cl jmp endread even1: and ax,0fffh endread: ;int 3h pop di pop es pop dx pop cx pop bx ret ;es: di=地址 ds: si=filename ax->起始扇区号 ax=-1 没找到 search_file: push bx push cx push si cld mov bx,di goon: mov di,bx ;and di,0ffe0h mov si,filename mov cx,11 repz cmpsb cmp cx,0 jz find add bx,32 cmp bx,200h ;FATOFS+512byte one sector jae nofind jmp goon find: ;print add di,15 mov ax,[es:di] ;add ax,31 jmp e nofind: mov ax,-1 e: pop si pop cx pop bx ret ;sectornum/18 ch=Q>>1 cl=R+1 dh=Q&1 ;ax=扇区号,sectnum1=扇区数 es:di=mem addr read_sect: push ax push bx push cx push dx push di mov bh,18 div bh mov ch,al shr ch,1 and al,1 mov dh,al inc ah mov cl,ah mov dl,00h mov bx,di readagine: ;mov bx,[init_kernel_ofs] ;mov es,[init_kernel_seg] mov ah,02h mov al,1 int 13h jc readagine pop di pop dx pop cx pop bx pop ax ret print_newline: push ax mov al,0dh call print_char mov al,0ah call print_char pop ax ret ;al char print_char: push ax push bx mov ah, 0eh ;mov al, '.' mov bx,000ch int 10h pop bx pop ax ret ;si addr ,cx count ,dh row ,dl col print_string: push ax ps: mov al,[si] call print_char inc si loop ps pend: pop ax ret times 510-($-$) db 0 dw 0xaa55 ;加载setup.bin文件 并跳转过去执行 。