关闭

msdos1.25引导程序分析

标签: msdos 引导程序
189人阅读 评论(0) 收藏 举报
分类:
;msboot for msdos 1.25
;Disassemble by Liu Xingxing 3/8/2016


ORIGIN        EQU    7C00h
BIO_SEG        EQU    60h
SECTOR_SIZE    EQU    200h

SEGBIOS SEGMENT AT BIO_SEG

    ; Define the destination segment of the BIOS, including the
    ; initialization label

BIOS    LABEL    BYTE

SEGBIOS ENDS
CODE    SEGMENT
ASSUME    CS:CODE
    ORG    ORIGIN
START:
jmp    SHORT Main            ; Jump to start of code
nop
FileArea    DW    0008h        ; Low store the sector num of file area and high store the tracks before the file area
LoadSectors    DW    0014h
        DB    20h dup(0)

Reboot:
        int    19h
;======================================================================
Main:
        cli
        mov    ax, cs
        mov    ds, ax
        xor    dx, dx
        mov    ss, dx        ;Work in stack just below this routine
        mov    sp, ORIGIN
        sti
        mov    ax, Bio_Seg
        mov    ds, ax
        mov    es, ax
        xor    dx, dx
        mov    ax, dx
        int    13h        ; Reset the disk system just in case any thing funny has happened.
                    ; DL = drive
        jc    Load_Failure
        call    Dir_Cont
        jc    SHORT Reboot
        cmp    FileArea, 8
        jz    SHORT SingleDsk
        mov    NumHeads, 2
SingleDsk:
        mov    bx, 0
        mov     cx, cs:[FileArea]
        push    cx
        mov    al, 9
        sub    al, cl
        mov    ah, 0
        mov    si, ax
Do_While:
        push    si
        xor    dx, dx
        xor    ax, ax
        mov    al, ch
        div    NumHeads
        mov    ch, al
        mov    dh, ah
        mov    ax, si
        mov    ah, 2
        int    13h        ; DISK - READ SECTORS INTO MEMORY
                    ; AL = number of sectors to read, CH = track, CL = sector
                    ; DH = head, DL    = drive, ES:BX -> buffer to fill
                    ; Return: CF set on error, AH =    status,    AL = number of sectors read
        jc    short Load_Failure
        pop    si
        pop    cx
        sub    LoadSectors, si
        jz    SHORT DISKOK
        mov    ax, si
        mul    BytesPerSector
        add    bx, ax
        inc    ch
        mov    cl, 1
        push    cx
        mov    si, 8
        cmp    si, LoadSectors
        jl    SHORT NextTrack
        mov    si, LoadSectors
NextTrack:    
        jmp    SHORT Do_While
;==================================================================
DISKOK:
        jmp    FAR PTR BIOS    ;CRANK UP THE DOS
;==================================================================
Load_Failure:
        mov    si, OFFSET FailMsg
        call    Write

Do_Loop:
        jmp    SHORT Do_Loop
;==================================================================
Write:
        xor    bh, bh

Writing:
        lods    byte ptr cs:[si]
        and    al, 7Fh
        jz    SHORT EndWr
        push    si
        mov    ah, 0Eh
        mov    bx, 7
        int    10h        ; - VIDEO - WRITE CHARACTER AND    ADVANCE    CURSOR (TTY WRITE)
                    ; AL = character, BH = display page (alpha modes)
                    ; BL = foreground color    (graphics modes)
        pop    si
        jmp    SHORT Writing

EndWr:
        retn
;==================================================================
jmp    START
;==================================================================
Dir_Cont:
        mov    bx, 0
        mov    cx, 4
        mov    ax, 201h
        int    13h        ; DISK - READ SECTORS INTO MEMORY
                    ; AL = number of sectors to read, CH = track, CL = sector
                    ; DH = head, DL    = drive, ES:BX -> buffer to fill
                    ; Return: CF set on error, AH =    status,    AL = number of sectors read
        push    ds
        jc    short CkErr
        mov    ax, cs
        mov    ds, ax
        mov    di, 0
        mov    cx, 0Bh

ToUpper:
        or    byte ptr es:[di], 20h
        or    byte ptr es:[di+20h], 20h
        inc    di
        loop    ToUpper
        mov    di, 0
        mov    si, OFFSET Bio
        mov    cx, 0Bh
        cld
        repe cmpsb
        jnz    short CkErr
        mov    di, 20h
        mov    si, OFFSET Dos
        mov    cx, 0Bh
        repe cmpsb
        jnz    SHORT CkErr
        pop    ds
        retn
;========================================================================
CkErr:
        mov    si, OFFSET SysMsg
        call    Write
        mov    ah, 0
        int    16h        ; KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
                    ; Return: AH = scan code, AL = character
        pop    ds
        stc
        retn
;========================================================================

SysMsg        DB    0Dh,0Ah,'Non-System disk or disk error',0Dh,0Ah
        DB    'Replace and strike any key when ready',0Dh,0Ah,0    
NumHeads    DB    1
BytesPerSector    DW    SECTOR_SIZE
FailMsg        DB    0Dh,0Ah,'Disk Boot failure',0Dh,0Ah,0
        DB    'Microsoft,Inc '
Bio        DB    'ibmbio  com0'
Dos        DB    'ibmdos  com0'
    ORG    ORIGIN+(SECTOR_SIZE-2)
        DB    55h,0AAh    ; Boot sector signature
CODE    ENDS
    END    START
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3497次
    • 积分:73
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档