FASM—USB don上的引导扇区';行不通

FASM—USB don上的引导扇区';行不通,usb,boot,fasm,sector,Usb,Boot,Fasm,Sector,首先,对不起我的英语不好,我是法国人。 目前,我使用fasm学习asm来测试引导扇区编程 我制作了一个简单的引导程序,我编译了它,并在usb的第一个扇区中编写了boot.bin 但当我在PC或virtualbox中启动时,找不到驱动器 引导扇区代码: ;======================================================================= ; a simpliest 1.44 bootable image by shoorick ;)

首先,对不起我的英语不好,我是法国人。 目前,我使用fasm学习asm来测试引导扇区编程

我制作了一个简单的引导程序,我编译了它,并在usb的第一个扇区中编写了boot.bin

但当我在PC或virtualbox中启动时,找不到驱动器

引导扇区代码:

;=======================================================================
;   a simpliest 1.44 bootable image by shoorick ;)
;=======================================================================
_bs equ 512
_st equ 18
_hd equ 2
_tr equ 80
;=======================================================================
    org 7C00h
    jmp start
    nop
;=====================================================
    db  "HE-HE OS";     ; 8
    dw  _bs             ; b/s
    db  1               ; s/c  
    dw  1               ; rs
    db  2               ; fats
    dw  224             ; rde
    dw  2880            ; as 
    db  0F0h            ; media
    dw  9               ; s/fat
    dw  _st             ; s/t
    dw  _hd             ; h
    dd  0               ; hs
    dd  0               ; --
    db  0               ; drv
    db  0               ; --
    db  29h             ; ebr
    dd  0               ; sn
    db  "NO NAME    ";  ; 11
    db  "FAT12   ";     ; 8
;=====================================================
start:
    mov   ax,cs
    mov   ds,ax
    mov   cx,count
    mov   si,hello
    mov   bx,7
    mov   ah,0Eh
@@:
    lodsb
    int   10h
    loop  @B
    xor   ah,ah
    int   16h
    int   19h

hello   db "Hi! This is disk-invalid!"
count = $ - hello  

;=======================================================================
    rb 7E00h-2-$
    db 055h,0AAh
;=======================================================================

此代码由fasm网站的示例提供。

引导加载程序无法工作的原因有两个:

  • 引导加载程序不在USB/软盘/etc的第一个扇区中
  • 引导加载程序的长度不完全是512字节
  • 引导加载程序的最后2个字节缺少0xAA55签名
  • 在您的示例中,我假设您的引导加载程序大小错误(不是512字节)

    试着替换

    rb 7E00h-2-$
    db 055h,0AAh
    


    这样可以确保文件的长度正好为512字节,并且具有所需的引导加载程序签名

    引导加载程序无法工作的原因有两个:

  • 引导加载程序不在USB/软盘/etc的第一个扇区中
  • 引导加载程序的长度不完全是512字节
  • 引导加载程序的最后2个字节缺少0xAA55签名
  • 在您的示例中,我假设您的引导加载程序大小错误(不是512字节)

    试着替换

    rb 7E00h-2-$
    db 055h,0AAh
    


    这样可以确保文件的长度正好为512字节,并且具有所需的引导加载程序签名

    您在BIOS中设置了正确的引导顺序吗?如果可能,请将USB设备移到顶部。您是否在BIOS中设置了正确的引导顺序?如果可能的话,将USB设备移到顶部。他的汇编文件是正确的。您使用的DB和DW是同一事物,但表达方式不同
    rb 7E00h-2-$
    实际上是有效的,它将生成所需的字节,以填充到放置引导签名的510处。让它成为512
    rb
    是一个FASM指令,用于保留指定数量的字节。@Michael Petch奇怪,如果我尝试使用他的方法填充510字节,则会得到一个32256字节长的二进制文件。我使用的是flat assembler 1.71.51,如果你不使用
    org 07c00h
    他的汇编文件是正确的,我想你会得到32256。您使用的DB和DW是同一事物,但表达方式不同
    rb 7E00h-2-$
    实际上是有效的,它将生成所需的字节,以填充到放置引导签名的510处。让它成为512
    rb
    是一个FASM指令,用于保留指定数量的字节。@Michael Petch奇怪,如果我尝试使用他的方法填充510字节,则会得到一个32256字节长的二进制文件。我使用的是flat assembler 1.71.51,如果不使用
    org 07c00h