如何使用assembly(8086)将usb驱动器的扇区加载到内存中?

如何使用assembly(8086)将usb驱动器的扇区加载到内存中?,assembly,operating-system,kernel,x86-16,bootloader,Assembly,Operating System,Kernel,X86 16,Bootloader,我在研究多级引导加载程序,其中扇区是使用int13h从软盘加载的。现在,我尝试使用相同的INT 13h将usb扇区加载到内存中 我假设我的代码如下 mov ah,02h ;sub function 2 to read sectors to memory mov al,2 ;to read two sectors mov cl,01h mov dl,81h ;the second fixed disk int 13h 我猜上面的代码并不完全正确,但是,这是加载usb扇区的方法吗?我的意思是我可以

我在研究多级引导加载程序,其中扇区是使用int13h从软盘加载的。现在,我尝试使用相同的INT 13h将usb扇区加载到内存中

我假设我的代码如下

mov ah,02h ;sub function 2 to read sectors to memory
mov al,2 ;to read two sectors
mov cl,01h
mov dl,81h ;the second fixed disk
int 13h
我猜上面的代码并不完全正确,但是,这是加载usb扇区的方法吗?我的意思是我可以使用同样的13小时中断吗? A.
任何源代码都可以欣赏。

我试图弄清楚您想要做什么:

  • 学习多级引导加载程序
  • 编写MBR代码并将其加载到USB的第一个扇区
  • 能够用这样的程序启动PC(在BIOS中启用传统选项)
  • 编程第二阶段代码以存储在以下磁盘扇区中,您希望从USB读取这些扇区并将其放入内存,以便通过跳转到第一条指令来运行它
是吗? 如果您的电脑可以从USB启动,那么以下MBR代码应该从同一设备读取一些扇区,将它们存储在内存中,并跳转到第一个内存位置,在该位置它应该是第二阶段代码的第一条指令。此代码将使用nasm进行组装

nasm-f bin文件名


希望这有帮助

昨天也有人问过这个问题。但它没有描述任何信息……信息是它可能在某些系统上工作,但在其他系统上不工作。原来的8086硬件没有USB驱动器,所以任何BIOS支持都是一个扩展。那么,我该如何实现它呢?我在网上也找不到任何来源。。。。请帮助..我希望通过
int 13h
ah=0x08
读取参数,并像使用硬盘一样使用参数访问。还有一个疑问…关于您提供的代码(再次感谢)…我可以将第2阶段文件放在USB或特定扇区的任何位置…请回答我的问题Sergio.Uma以及为什么dl寄存器没有给出任何值?第2阶段可以放在任何其他扇区上,但相应地修改磁头、cilinder和扇区(dh、ch和cl寄存器)。如果为文件系统格式化USB,通常第一个磁道(track0)未使用,因此您有63个可用扇区。BIOS在不同磁盘中搜索MBR签名,当发现时,BIOS会将512字节复制到内存并跳转到它。我猜这样的复制是通过INT 13h完成的,所以BIOS将dl寄存器设置为指向当前使用的磁盘,这样,如果第二阶段位于MBR所在的同一设备上,则不需要设置或修改
[bits 16]
[org 0x7c00]    ; this MBR code resides here (512 bytes)

boot:
mov ax,0x0100   ; stack lower bound
mov ss,ax       ; set stack at address 0x1000
mov sp,0x2000   ; 8KB stack

;load second stage code from disk to address 0x07e00 (just above)
read:
xor ax,ax       ; Floppy Reset BIOS Function
                ; DL -> device (BIOS left 0x0:floppy or 0x80:HDD)
int 0x13        ; unnecesary to set DL because BIOS did the work
jc read

mov ax,0x07e0
mov es,ax   ; SEGMENT
xor bx,bx   ; OFFSET
xor dh,dh   ; dh=0 (head); dl = device
mov cx,2    ; ch=0 (cilinder) ; cl = 2 (1st sector, number 2)
mov ax,2*256+17 ; ah=2 (read); al=17 (sectors)
int 0x13
jc read     ;retry jump in case of read error

stop:
mov dx,0x3F2 ; stop the motor from spinning
mov al,0x0C  ; unnecesary in case of USB, only for floppy
out dx,al 

;jump to second stage code (first intruction at very beggining)
mov ax,0x07e0
mov ds,ax
jmp 0x07e0:0x0


TIMES 510-($-$$) DB 0

SIGNATURE DW 0xAA55