• 【0x01 初探启动程序】


    来着日本天才的30天自制操作系统

     1 ; df-os
     2 ; TAB=4
     3 
     4         ORG        0x7c00            ;程序装载地址
     5 
     6         JMP        entry
     7         DB        0x90
     8         DB        "DFISHIPL"        ; 8字节启动区名称
     9         DW        512                ; 每个扇区512字节
    10         DB        1                ; 簇大小
    11         DW        1                ; FAT起始位置
    12         DB        2                ; FAT个数
    13         DW        224                ; 根目录大小
    14         DW        2880            ; 磁盘大小
    15         DB        0xf0            ; 磁盘种类
    16         DW        9                ; FAT长度
    17         DW        18                ; 1个磁道有几个扇区
    18         DW        2                ; 磁头数
    19         DD        0                ; 不使用分区
    20         DD        2880            ; 重写一次磁盘大小
    21         DB        0,0,0x29        ; 不明
    22         DD        0xffffffff        ; 不明
    23         DB        "HELLO-OS   "    ; 磁盘名称
    24         DB        "FAT12   "        ; 磁盘格式名称
    25         RESB    18                ; 空出18字节
    26 
    27 
    28 
    29 entry:
    30         MOV        AX,0            
    31         MOV        SS,AX
    32         MOV        SP,0x7c00        ;SS:SP指向 0:7c00
    33         MOV        DS,AX            ;DS:?? 指向 0:??
    34 ;读磁盘
    35         MOV        AX,0X820
    36         MOV        ES,AX            ;ES:BX 为缓冲区地址 
    37         MOV        CH,0            ;柱面头0
    38         MOV     DH,0            ;磁头0
    39         MOV     CL,2            ;扇区2
    40         
    41         MOV        SI,0            ;记录读取失败的次数
    42 retry:        
    43         MOV     AH,0X02            ;读盘
    44         MOV     AL,1            ;1个扇区
    45         MOV     BL,0
    46         MOV     DL,0X00            ;A驱动器
    47         INT     0X13            ;调用磁盘BIOS
    48         JNC        fin                ;未出错就跳到fin
    49         ADD        SI,1
    50         CMP        SI,5            ;如果读取失败次数大于5 认为读取错误
    51         JAE        error
    52         ;系统复位
    53         MOV        AH,0X00            ;A驱动器
    54         MOV        DL,0X00
    55         INT        0X13            ;重置驱动器
    56         JMP        retry
    57 fin:
    58         HLT
    59         JMP        fin
    60 error:
    61         MOV     SI,msg
    62 putloop:
    63         MOV        AL,[SI]            ;读取一个字符    
    64         ADD        SI,1            
    65         CMP        AL,0            ;字符串读到0 就结束
    66         JE        fin
    67         MOV        AH,0x0e            
    68         MOV        BX,15            
    69         INT        0x10            
    70         JMP        putloop
    71 msg:
    72         DB        0x0a, 0x0a
    73         DB        " df-os All rights reserved "
    74         DB        0x0a, 0x0a
    75         DB        " developed by deadfish ~^__^~"
    76         DB        0
    77 
    78         RESB    0x7dfe-$        
    79         DB        0x55, 0xaa

    程序开始就指明了程序的装载地址0x7c00 具体参考:https://www.douban.com/note/249471773/

    简单来说就是:开机的时候,电脑首先执行的是BIOS(基础输入输出)程序,然后BIOS从指定的设备加载数据,

    而加载数据的地址已经定死了,就是这个0x7c00。

    然后跳到了entry这个地方,entry首先把栈的地址指向了启动区初始地址(对了,entry和指定装载位置中间的那些DB专门史针对FAT12格式软盘,具体不明 - - )

    接着entry就进行一系列都盘操作。读取的位置从0x8200开始(启动区是 0x7c00-0x7dff 512个字节,一个扇区)

    读磁盘采用int 0x13 参考:https://en.wikipedia.org/wiki/INT_13H

    读取成功就进行一个死循环

    读取失败就输出最后那些字符串。

    最后值得注意的是RESB 那边 就是为了填0,把启动去填满

  • 相关阅读:
    javascript 操作DOM元素样式
    javascript 对象
    javascript 事件对象
    javascript 常用尺寸属性
    团队编程项目作业3-模块开发过程
    buuctf-misc 基础加密
    buuctf-misc 你竟然赶我走
    buuctf-misc 大白
    buuctf-misc N种方法解决
    buuctf-misc二维码
  • 原文地址:https://www.cnblogs.com/driedfish/p/5443852.html
Copyright © 2020-2023  润新知