【问题标题】:Simple USB Bootloader简单的 USB 引导加载程序
【发布时间】:2015-02-06 23:32:52
【问题描述】:

我正在尝试制作一个可以从 USB 运行的简单引导加载程序。在几个问题之后,我尝试使用以下 asm 代码块(我从MikeOS 获得):

BITS 16

start:
mov ax, 07C0h       ; Set up 4K stack space after this bootloader
add ax, 288     ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096

mov ax, 07C0h       ; Set data segment to where we're loaded
mov ds, ax

mov si, msg
call move

jmp $   

msg db 'Whatever!', 0

move:
mov ah, 0Eh

.print:
lodsb
cmp al,0
je .Done
int 10h
jmp .print

.Done:
ret

times 510-($-$$) db 0   
dw 0xAA55       

当我尝试从 USB 启动 L 时,这导致 L 被打印无数次 :( 谁能告诉我我做错了什么。

我正在使用 dd 将其复制到扇区 0。

编辑:不知何故,这在我的 PC 上不起作用,但在我姐妹的笔记本电脑上起作用。 有人知道为什么吗?

【问题讨论】:

  • 你的代码对我有用:cl.ly/image/2H0E0Z3I0S3y
  • 每当我尝试从 QEmu 或 Virtual Box 运行它时它都能正常工作,但是当我重新启动 PC 并直接从 USB 启动它时就会出现问题

标签: assembly usb bootloader


【解决方案1】:

您发布的代码中没有可以解释这些症状的错误。

注意:有 2 个错误。它假定方向标志是明确的并且在lodsb 之前不执行cld,但这可能会导致它显示'W' 后跟奇怪的字符(而不是重复的'L')。它也没有在bh 中为“int 0x10,ah=0x0E”使用的页码设置值,但这可能会导致不显示任何内容(而不是重复“L”)。

鉴于代码本身没有原因;最可能的问题是您如何将生成的二进制文件复制到 USB 闪存上的问题(更有可能),或者是您如何组装代码的问题(不太可能)。

【讨论】:

  • 感谢您的回复!我正在使用 dd if=Simple.bin of=/dev/sdc bs=512 count=1 我很确定我复制它是正确的,因为我在十六进制编辑器中检查了它,它显示了第 0 扇区的文件我进行了修改以修复错误,现在它没有显示任何内容,光标在第二行并闪烁(我可能做错了修改,但同样,它在虚拟管理器中工作正常并导致启动时出现问题)
  • @IrLearn:对于“不显示任何内容”,可能在使用“int 0x10, ah=0x0E”之前设置bh 可能会有所帮助.. ;-)
猜你喜欢
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2019-03-09
  • 2016-12-02
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多