| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3514 人关注过本帖
标题:《自己动手写操作系统》,boot部分搞定,特来上码,是NASM不是MASM,注意编 ...
取消只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
已结贴  问题点数:20 回复次数:3 
《自己动手写操作系统》,boot部分搞定,特来上码,是NASM不是MASM,注意编译器
%define buffseg 09000h

    org 07c00h
    jmp short LABEL_START        ; Start to boot.
    nop                ; 这个 nop 不可少

    ; 下面是 FAT12 磁盘的头
    BS_OEMName    DB 'ForrestY'    ; OEM String, 必须 8 个字节
    BPB_BytsPerSec    DW 512        ; 每扇区字节数
    BPB_SecPerClus    DB 1        ; 每簇多少扇区
    BPB_RsvdSecCnt    DW 1        ; Boot 记录占用多少扇区
    BPB_NumFATs    DB 2        ; 共有多少 FAT 表
    BPB_RootEntCnt    DW 224        ; 根目录文件数最大值
    BPB_TotSec16    DW 2880        ; 逻辑扇区总数
    BPB_Media    DB 0xF0        ; 媒体描述符
    BPB_FATSz16    DW 9        ; 每FAT扇区数
    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 'Tinix0.01  '; 卷标, 必须 11 个字节
    BS_FileSysType    DB 'FAT12   '    ; 文件系统类型, 必须 8
LABEL_START:
mov ax,cs
mov ds,ax
mov ss,ax
mov sp,0100h
mov bp,0100h


zzz:
xor  bx,bx
call readdisk


xor di,di
inc word[rootdirsector]
cmp word[rootdirsector],33
jae nofind
ad:
mov si,LoaderFileName
mov cx,11
repe cmpsb
jcxz find
and  di,0ffe0h
add  di,20h
inc  byte[num]
cmp  byte[num],13
je   zzz
jmp  ad


jmp $

readdisk:
mov ah,0
mov dl,0
int 13h
push bx
mov ax,[rootdirsector]
mov bl,18
div bl

inc ah
mov cl,ah

mov dh,al
shr al,1
mov ch,al
and dh,1
mov dl,0
mov ax,buffseg
mov es,ax
pop bx
xx:
mov ah,02h
mov al,byte[sectornum]
int 13h
jc  xx
ret

find:   
    add di,0fh
        mov ax,[es:di]
    push ax

    xor bx,bx
    mov byte[sectornum],2
    mov word[rootdirsector],1
    call readdisk
   
    mov bx,0400h
    pop ax
readnext:
    push bx
    push ax
   
    mov  word[rootdirsector],ax
    add  word[rootdirsector],31
    mov  word[sectornum],1
    call readdisk
   
   

    pop ax
    mov bx,12
    mul bx
    mov bx,8
    div bx

    mov bx,ax
    mov ax,[es:bx]
    cmp dx,0
    je  oushu
    shr ax,4
    jmp xa

oushu:   
    and ax,0fffh   
xa:   
   
    cmp  ax,0ff8h
    jae  jieshu
    cmp  ax,0ff7h
    je   huaipan  
    pop  bx
    add  bx,0200h
    jmp  readnext



jieshu:
    jmp 09000h:0400h
huaipan:
    jmp $
        
nofind:
    push nofindmessage
    push nofindstrlen
        mov  dh,0
    mov ax,cs
    mov es,ax
    call dispstr
    add sp,4
    jmp $

   
dispstr:
    mov    ax, [bp-2]
    mov    cx, [bp-4]
    push    bp
    mov    bp, ax            ; ES:BP = 串地            ; CX = 串长度
    mov    ax, 01301h        ; AH = 13,  AL = 01h
    mov    bx, 000ch        ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
    mov    dl, 0
    int    10h
    pop     bp            ; int 10h
    ret

buffoffset            dw     0400h
sectornum         db    1   
num            db      0   
rootdirsector       dw      19
findmessage        db      "find...."
findstrlen              equ     $-findmessage        
nofindmessage           db    "find fail..."
nofindstrlen            equ     $-nofindmessage
LoaderFileName        db    "LOADER  BIN"
strlen             equ    $-LoaderFileName
times     510-($-$$)    db    0    ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw     0xaa55                ; 结束标志
搜索更多相关主题的帖子: 编译器 操作系统 根目录 最大值 记录 
2013-09-10 17:21
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
程序代码:
%define    _BOOT_DEBUG_    ; 做 Boot Sector 时一定将此行注释掉!将此行打开后用 nasm Boot.asm -o  做成一个.COM文件易于调试

%ifdef    _BOOT_DEBUG_
    org  0400h            ; 调试状态, 做成 .COM 文件, 可调试
%else
    org  07c00h            ; Boot 状态, Bios 将把 Boot Sector 加载到 0:7C00 处并开始执行
%endif

    mov    ax, cs
    mov    ds, ax
    mov    es, ax
    call    DispStr            ; 调用显示字符串例程
    jmp    $            ; 无限循环
DispStr:
    mov    ax, BootMessage
    mov    bp, ax            ; ES:BP = 串地址
    mov    cx, 16            ; CX = 串长度
    mov    ax, 01301h        ; AH = 13,  AL = 01h
    mov    bx, 000ch        ; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
    mov    dl, 0
    int    10h            ; int 10h
    ret
BootMessage:        db    "Hello, OS world!"
times     510-($-$$)    db    0    ; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw     0xaa55                ; 结束标志
供上面 代码 加载的实验程序,程序加载地址为 0400h

我要成为嘿嘿的黑客,替天行道
2013-09-10 17:22
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
写的磕磕绊绊,写完了 ,回头再看 我也没干什么

我要成为嘿嘿的黑客,替天行道
2013-09-10 17:25
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
下一步让咱的爱机进入保护模式

我要成为嘿嘿的黑客,替天行道
2013-09-11 00:25
快速回复:《自己动手写操作系统》,boot部分搞定,特来上码,是NASM不是MASM,注 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042985 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved