【问题标题】:How can I load the sectors of a usb drive into memory using assembly(8086)?如何使用程序集(8086)将 USB 驱动器的扇区加载到内存中?
【发布时间】:2023-03-30 11:06:01
【问题描述】:

我正在研究使用 INT 13h 从软盘加载扇区的多阶段引导加载程序。现在我正在尝试使用相同的 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 小时中断吗? 一种 任何源代码都可以欣赏..

【问题讨论】:

  • 昨天也有人问过这个问题。 How to load the sectors of a USB drive?
  • 但它没有描述任何信息......
  • 信息是它可能适用于某些系统,但不适用于其他系统。最初的 8086 硬件没有 USB 驱动器,因此任何 BIOS 支持都是扩展。
  • 那么,我该如何实现呢?我也没有在网上找到任何来源..请帮助..
  • 我希望通过int 13hah = 0x08 读取参数,并像硬盘一样使用参数访问。

标签: assembly operating-system kernel x86-16 bootloader


【解决方案1】:

我试图弄清楚你想做什么:

  • 学习多阶段引导加载程序
  • 编写 MBR 代码并将其加载到 USB 的第一个扇区中
  • 能够使用此类程序启动 PC(在 BIOS 中启用旧选项)
  • 编写要存储在以下磁盘扇区中的第二阶段代码,您希望从 USB 读取这些扇区并将其放入内存中,以便通过跳转到第一条指令来运行它

¿对吗? 如果您的 PC 可以从 USB 启动,那么下面的 MBR 代码应该从同一设备读取一些扇区,将它们存储在内存中并跳转到它应该是第二阶段代码的第一条指令的第一个内存位置。这段代码是用nasm组装的

nasm -f bin 文件名

[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

希望对您有所帮助!

【讨论】:

  • 还有一个疑问...使用您提供的代码(再次感谢)...我可以将我的第 2 阶段文件放在我的 USB 上的任何位置或特定扇区上...
  • 请回答我的问题 Sergio.Uma 还有为什么 dl 寄存器没有被赋予任何价值?
  • Stage 2 可以放置在任何其他扇区,但要相应地修改 head、cilinder 和扇区(dh、ch 和 cl 寄存器)。如果为文件系统格式化 USB,通常第一个磁道 (track0) 未使用,因此您有 63 个可用扇区。
  • BIOS 在不同的磁盘中搜索一个 MBR 签名,当找到时 BIOS 将这 512 个字节复制到内存并跳转到它。我猜这种复制是通过 INT 13h 完成的,因此 BIOS 将 dl 寄存器设置为指向当前使用的磁盘,因此如果第二阶段位于 MBR 所在的同一设备上,则无需设置或修改
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2012-08-18
相关资源
最近更新 更多