【发布时间】:2017-11-17 18:37:59
【问题描述】:
我已经在汇编中制作了一个基本的引导加载程序,但它实际上并没有跳转到内核。它只是说“正在启动......”。我敢肯定这只是我犯的一些愚蠢的错误,比如跳错了地方。它应该显示类似“正在启动...已加载!”的输出。我也尝试在加载之前将 es 设置为 0,但即使这样也不起作用。这是我的代码:
mov ax, 9ch
mov ss, ax
mov sp, 4096d
mov ax, 7c0h
mov ds, ax
mov es, ax
xor ah, ah
int 13h
clc
mov si, msg2
call print
mov ah, 02h
xor ax, ax
mov es, ax
mov bx, 0x7E00
mov al, 1h
mov ch, 0
mov cl, 2h
mov dh, 0
int 13h
jc error
jmp 0x7E00
mov si, msg3
call print
error:
mov si, msg
call print
hlt
print:
lodsb
cmp al, 0
jz done
mov ah, 0eh
int 10h
jmp print
done:
ret
msg db "An error occured!!", 0
msg2 db "Booting...", 0
msg3 db "Did not jump to kernel correctly!"
times 510-($-$$) db 0
dw 0xAA55
mov si, msgloaded
call printl
jmp $
printl:
lodsb
cmp al, 0
jz donel
mov ah, 0eh
int 10h
jmp print
donel:
ret
msgloaded db "Loaded!", 0
times 0x400-($-$$) db 0
感谢所有帮助。我会感谢任何可以帮助我的人。谢谢!
【问题讨论】:
-
可能是因为你连内核都没有跳转?
-
糟糕。一定是在将其复制到框中时不小心删除了。对不起。
-
另外,您的
int 13h调用显然位于错误的位置(甚至在设置参数之前???)并且它正在将数据加载到错误的位置。 -
int 13h 实际上应该被调用两次。一次重置驱动器,一次加载它。我修复了它,即使现在它仍然无法正常工作。
-
您将段设置为
7c0h,因此加载和跳转到的偏移量当然是200h而不是7e00h。
标签: assembly x86 operating-system bootloader 16-bit