简单的USB Bootloader

时间:2015-02-06 23:32:53

标签: assembly usb bootloader

我正在尝试制作一个可以从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被无限次打印:( 任何人都可以让我知道我做错了什么。

我正在使用dd将其复制到Sector 0中。

编辑:这在某种程度上不适用于我的电脑,但适用于我的姐妹笔记本电脑。 任何人都知道为什么?

1 个答案:

答案 0 :(得分:1)

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

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

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