msdos1.25引导程序分析

原创 2016年08月31日 10:19:43
;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

相关文章推荐

错误程序分析

  • 2014年11月11日 16:56
  • 1KB
  • 下载

C++程序分析及运行结果

  • 2013年10月29日 22:04
  • 86KB
  • 下载

caffe cuda 程序分析

caffe 用cuda 来进行加速, 看完caffe CPU的程序,再去看 CUDA程序, 变得很容易了 在layer文件中, cuda 程序和CPU程序类似,只是调用math_functi...

经典C程序分析

  • 2012年09月26日 08:46
  • 84KB
  • 下载

基于EasyDarwin的实现无人机远程视频传输--RTSP初始化程序分析

该文章整理于http://blog.csdn.net/longlong530 和 http://blog.csdn.net/longlong530/article/details/43194075 ...

C_复习题——程序分析题问答题

  • 2013年03月27日 16:51
  • 68KB
  • 下载

tiidf算法程序分析

  • 2014年11月22日 22:43
  • 56KB
  • 下载

nrf51822学习之第一个BLE程序分析

今天来分析一个例程《BLE实验1:蓝牙工程样例》,注意这里并不是十分专业的讲解,完全是本人的一点小笔记,并没有太大的参考价值,但是如果幸运的话,能让我们有点小的灵感 这是一个最简单的BLE程序了,ke...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:msdos1.25引导程序分析
举报原因:
原因补充:

(最多只允许输入30个字)