NASM - 从 USB 驱动器加载代码

标签 nasm bootloader usb-drive qemu

任何汇编专家都知道表示第一个 USB 驱动器的参数(寄存器dl)吗?

我正在学习一些 NASM 教程,并且想要获得物理启动(我可以使用 qemu 获得干净的启动)。

这是从磁盘加载“内核”数据的代码部分:

loadkernel:
    mov si, LMSG ;; 'Loading kernel',13,10,0
    call prints  ;; ex puts()

    mov dl, 0x00 ;; The disk to load from
    mov ah, 0x02 ;; Read operation
    mov al, 0x01 ;; Sectors to read
    mov ch, 0x00 ;; Track
    mov cl, 0x02 ;; Sector
    mov dh, 0x00 ;; Head
    mov bx, 0x2000 ;; Buffer end
    mov es, bx
    mov bx, 0x0000 ;; Buffer start

    int 0x13
    jc loadkernel

    mov ax, 0x2000
    mov ds, ax

    jmp 0x2000:0x00

如果有什么区别的话,我正在运行原装 Dell Inspiron 15 BIOS。

<小时/>

显然,对我来说正确的值是 0x80。

BIOS 加载硬盘并从 0x80 according to this answer 开始标记它们。 .

出于某种原因,我的特定 BIOS 决定将 USB 驱动器作为第一个加载,这样我就可以从那里启动。

最佳答案

简单的答案是 dl 的正确值位于 dl 中。

令人高兴的答案是 dl 值与 int 13h, ah=8 GET DRIVE PARAMETERS 返回要使用的几何图形并允许 FAT12 软盘镜像代码运行从任何可以从 USB 闪存驱动器启动的 BIOS/版本。

在这里查看我的帖子:USB Booting Secrets

关于NASM - 从 USB 驱动器加载代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4703595/

相关文章:

assembly - NASM 引导加载程序的奇怪行为

linux - 如何在 64 位机器上使用 gcc 编译 32 位 .o 文件?

assembly - NASM 中的两个数字相除

linux - 将 EFI 内存映射转换为 E820 映射

assembly - Int 10H 在 QEMU 中不起作用

android - 如何从 U 盘读取数据?

assembly - Nasm:宏未扩展为指令的操作数

linux - 为什么我们需要创建一个中断向量表?

android - 开始 Activity 时将 USB 拇指驱动器挂载到 android things

基于Java的USB应用程序