美文网首页
【验证硬盘扇区号从1开始】

【验证硬盘扇区号从1开始】

作者: 月下蓑衣江湖夜雨 | 来源:发表于2020-10-20 01:36 被阅读0次

    硬盘扇区号从1开始(不是从0开始)

    程序 起始扇区号 程序大小(扇区数)
    bootsec.asm 1 1
    loader.asm 2 15
    kernel.bin 20 15

    nasm bootsec.asm -o bootsec.com
    nasm loader.asm -o loader.com
    nasm kernel.asm -o kernel.com

    dd if=bootsec.com of=/dev/sda
    dd if=loader.com of=/dev/sda bs=512 count=15 seek=1
    dd if=kernel.com of=/dev/sda bs=512 count=15 seek=19

    代码

    bootsec.asm

    ; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
    BaseOfLoader            equ   09000h                  ; LOADER.BIN 被加载到的位置 ----  段地址
    OffsetOfLoader          equ   0100h                   ; LOADER.BIN 被加载到的位置 ----  偏移地址
    BeginSectorOfLoader     equ   2                       ; loader起始扇区放在2位置
    SectorNumsOfLoader      equ   15                      ; loader占用扇区数
    
    BaseOfKernelFile        equ   08000h                  ; KERNEL.BIN 被加载到的位置 ----  段地址
    OffsetOfKernelFile      equ   0h                      ; KERNEL.BIN 被加载到的位置 ----  偏移地址
    BeginSectorOfKernelFile equ   20                      ; KernelFile起始扇区放在2位置
    SectorNumsOfKernelFile  equ   15                      ; KernelFile占用扇区数
    ; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
    ; 符号定义结束
    
      org 7c00h
      mov ax, cs
      mov ds, ax
      mov es, ax
      
      mov dh,0 
      mov dl,0
      call SetLn  
      
      mov ax, BootMsg1
      mov cx, 18
      call DspStr
      
      mov dh,1 
      mov dl,0
      call SetLn
      
      mov ax, BootMsg2
      mov cx, 18
      call DspStr
      
      push es
      push bx
      
      ;加载loader
      mov ax, BaseOfLoader
      mov es, ax
      mov bx, OffsetOfLoader
      
      mov ah, 02h
      mov al, SectorNumsOfLoader
      mov ch, 00h
      mov cl, BeginSectorOfLoader
      mov dh, 00h
      mov dl, 80h
      
      int 13h
      
      ;加载内核
      mov ax, BaseOfKernelFile
      mov es, ax
      mov bx, OffsetOfKernelFile
      
      mov ah, 02h
      mov al, SectorNumsOfKernelFile
      mov ch, 00h
      mov cl, BeginSectorOfKernelFile
      mov dh, 00h
      mov dl, 80h
      
      int 13h
      
      pop bx
      pop es
      
      ;跳转到loader
      jmp BaseOfLoader:OffsetOfLoader
    
    SetLn:
      mov ah,2 
      mov bh,0 
      ;mov dh,光标行号 
      ;mov dl,光标列号 
      int 10h 
      
      ret  
    
    DspStr:
      mov bp, ax
      mov ax, 01301h
      mov bx, 000ch
      mov dl, 0
      int 10h
    
      ret
      
    BootMsg1:             db  "[boot] load loader"
    BootMsg2:             db  "[boot] load kernel"  
    
    times 510 - ($ - $$) db  0
    dw 0xaa55
    

    loader.asm

    ; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
    BaseOfLoader            equ   09000h                  ; LOADER.BIN 被加载到的位置 ----  段地址
    OffsetOfLoader          equ   0100h                   ; LOADER.BIN 被加载到的位置 ----  偏移地址
    BeginSectorOfLoader     equ   2                       ; loader起始扇区放在2位置
    SectorNumsOfLoader      equ   15                      ; loader占用扇区数
    
    BaseOfKernelFile        equ   08000h                  ; KERNEL.BIN 被加载到的位置 ----  段地址
    OffsetOfKernelFile      equ   0h                      ; KERNEL.BIN 被加载到的位置 ----  偏移地址
    BeginSectorOfKernelFile equ   20                      ; KernelFile起始扇区放在2位置
    SectorNumsOfKernelFile  equ   15                      ; KernelFile占用扇区数
    ; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
    ; 符号定义结束
    
      org 0100h
      mov ax, cs
      mov ds, ax
      mov es, ax
      
      mov dh,2 
      mov dl,0
      call SetLn
    
      mov ax, LoaderMsg
      mov cx, 16
      call DspStr
      
      ;跳转到kernel
      jmp BaseOfKernelFile:OffsetOfKernelFile
    
    SetLn:
      mov ah,2 
      mov bh,0 
      ;mov dh,光标行号 
      ;mov dl,光标列号 
      int 10h 
      
      ret   
    
    DspStr:
      mov bp, ax
      mov ax, 01301h
      mov bx, 000ch
      mov dl, 0
      int 10h
    
      ret
      
    LoaderMsg:   db  "[loader] dsp str"
    

    kernel.asm

    ; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
    BaseOfLoader            equ   09000h                  ; LOADER.BIN 被加载到的位置 ----  段地址
    OffsetOfLoader          equ   0100h                   ; LOADER.BIN 被加载到的位置 ----  偏移地址
    BeginSectorOfLoader     equ   2                       ; loader起始扇区放在2位置
    SectorNumsOfLoader      equ   15                      ; loader占用扇区数
    
    BaseOfKernelFile        equ   08000h                  ; KERNEL.BIN 被加载到的位置 ----  段地址
    OffsetOfKernelFile      equ   0h                      ; KERNEL.BIN 被加载到的位置 ----  偏移地址
    BeginSectorOfKernelFile equ   20                      ; KernelFile起始扇区放在2位置
    SectorNumsOfKernelFile  equ   15                      ; KernelFile占用扇区数
    ; 符号定义 ------------------------------------------------------------------------------------------------------------------------------------------------------
    ; 符号定义结束
    
      org 0h
      mov ax, cs
      mov ds, ax
      mov es, ax
    
      mov dh,3
      mov dl,0
      call SetLn
    
      mov ax, KernelMsg
      mov cx, 16
      call DspStr
      
      ;死循环
      jmp $
      
    SetLn:
      mov ah,2 
      mov bh,0 
      ;mov dh,光标行号 
      ;mov dl,光标列号 
      int 10h 
      
      ret  
    
    DspStr:
      mov bp, ax
      mov ax, 01301h
      mov bx, 000ch
      mov dl, 0
      int 10h
    
      ret
      
    KernelMsg:   db  "[kernel] dsp str"
    

    效果

    效果

    相关文章

      网友评论

          本文标题:【验证硬盘扇区号从1开始】

          本文链接:https://www.haomeiwen.com/subject/mgglmktx.html