我正在尝试制作一个可以从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中。
编辑:这在某种程度上不适用于我的电脑,但适用于我的姐妹笔记本电脑。 任何人都知道为什么?
答案 0 :(得分:1)
您发布的代码中没有可以解释症状的错误。
注意:有2个错误。它假定方向标志是清晰的,并且在cld
之前没有lodsb
,但这可能导致它显示'W'后跟奇怪的字符(而不是'L'重复)。对于“int 0x10,ah = 0x0E”使用的页码,它也没有在bh
中设置一个值,但这可能不会显示任何内容(而不是重复的'L')。
鉴于代码本身没有原因;最可能的问题是如何将生成的二进制文件复制到USB闪存上的问题(更有可能),或者组装代码的方式存在问题(不太可能)。