Assembly 如何确定引导设备

Assembly 如何确定引导设备,assembly,x86,device,boot,Assembly,X86,Device,Boot,我还有一个问题不是那么容易搞错的。假设BIOS已经从指定的设备加载了我的引导加载程序,那么我现在如何找出它是哪一个设备,以便我可以将其余的操作系统加载到ram中呢?如果它(可能还有其他情况?我不能100%肯定)DL将包含 驱动器号,即您可以这样做(替换您自己的内存布局等): 但是,正如您所看到的,它的大部分只存在于标准文档的页面中,而不存在于现实中。实际上,当以旧的PC/AT和PC98方式引导时,使用DL作为固件驱动器号,并使用驱动器中的“隐藏扇区”字段(或者,更不理想的是,使用某种形式的专业工

我还有一个问题不是那么容易搞错的。假设BIOS已经从指定的设备加载了我的引导加载程序,那么我现在如何找出它是哪一个设备,以便我可以将其余的操作系统加载到ram中呢?

如果它(可能还有其他情况?我不能100%肯定)
DL
将包含 驱动器号,即您可以这样做(替换您自己的内存布局等):

但是,正如您所看到的,它的大部分只存在于标准文档的页面中,而不存在于现实中。实际上,当以旧的PC/AT和PC98方式引导时,使用
DL
作为固件驱动器号,并使用驱动器中的“隐藏扇区”字段(或者,更不理想的是,使用某种形式的专业工具维护的“嵌入式块列表”)作为驱动器中卷的位置


当然,如果有人正在以新的方式(至少在x86 PC世界)进行引导,那么。操作系统引导加载程序是引导管理器菜单上的一个条目,引导管理器菜单条目有一个参数系统,当引导管理器程序运行时,这些参数会传递给加载程序。其中一个参数是引导卷的位置,操作系统引导加载程序使用该位置查找操作系统文件。事实上,这就是Windows NT长期以来的工作方式。

thx很多家伙。。我从来不知道DL中的值代表什么。
EntryPoint: 
    xor ax, ax
    mov ss, ax
    mov ds, ax
    mov sp, 0x7c00
.DiskReset:
    mov ah, 0
    int 0x13
    jc .DiskReset
    mov ax, 0x50 ; load to 0x500 linear address. It has unused space up to 0x7bff
    mov es, ax
    xor bx, bx
    mov ax, 0x023B ; count = 0x3b = 59, the maximum..
    mov cx, 0x0002
    xor dh, dh ; leave (dl = drive number) intact
    int 0x13
    jnc .ReadDone
    mov si, ReadError
    call PrintString16
    jmp .DiskReset
.ReadDone:
    ; ......