【发布时间】:2015-12-18 13:04:23
【问题描述】:
我正在编写小型操作系统 - 用于练习。我从引导加载程序开始。
我想创建在 16 位实模式下运行的小型命令系统(目前)。
我创建了用于重置驱动器的引导加载程序,然后在引导加载程序之后加载扇区。
问题是因为在jmp 函数之后实际上没有发生任何事情。
我没有尝试在引导加载程序之后加载 0x7E00 处的下一个扇区(我不完全确定如何使用 es:bx 指向地址,所以这可能是个问题,我相信它的地址:偏移量)。
这是代码:
;
; SECTOR 0x0
;
;dl is number of harddrive where is bootloader
org 0x7C00
bits 16
;reset hard drive
xor ah,ah
int 0x13
;read sectors
clc
mov bx,0x7E00
mov es,bx
xor bx,bx
mov ah,0x02 ;function
mov al,0x1 ;sectors to read
mov ch,0x0 ;tracks
mov cl,0x1 ;sector
mov dh,0x0 ;head
int 0x13
;if not readed jmp to error
jc error
;jump to 0x7E00 - executed only if loaded
jmp 0x7E00
error:
mov si,MSGError
.loop:
lodsb
or al,al
jz .end
mov ah,0x0E
int 0x10
jmp .loop
.end:
hlt
MSGError db "Error while booting", 0x0
times 0x1FE - ($ - $$) db 0x0
db 0x55
db 0xAA
;
; SECTOR 0x1
;
jmp printtest
;definitions
MSGLoaded db "Execution successful", 0x0
;
; Print function
; si - message to pring (NEED TO BE FINISHED WITH 0x0)
printtest:
mov si,MSGLoaded
.loop:
lodsb
or al,al
jz .end
mov ah,0x0E
int 0x10
jmp .loop
.end:
hlt
times 0x400 - ($-$$) db 0x0
我一直在使用 VirtualBox 测试这段代码,但实际上什么也没发生,读取错误没有显示,以及应该打印的消息。
【问题讨论】:
-
在发出任何 BIOS 中断之前,您需要设置堆栈(
SS和SP寄存器)。在使用 lodsb 和相关功能之前,您还需要调用CLD或STD。您的代码假定自动递增,因此在设置堆栈调用CLD之后。您似乎也没有使用适当的段设置DS寄存器(否则 lodsb 可能无法正常工作)。从您所呈现的内核映像的原点设置到的内容中,尚不清楚。您用于链接、编译、创建磁盘映像的 makefile 或命令将对您的问题有益。 -
mov bx,0x7E00;mov es,bx,xor bx, bx似乎可能是错误的。您的代码建议您打算从磁盘加载扇区0x0000:0x7E00=物理地址0x7E00,但您将ES:BX段设置为0x7E00和BX为零,从而产生物理地址0x7E000x7E000 。我认为您的意思是将ES设置为0x07E0,这将产生 0x07E00x7E00 的物理地址。您基本上将内核加载到内存中的位置比您预期的要高得多。尝试将“mov bx,0x7E00”更改为mov bx,0x07E0 -
我的内核的起源是扇区 0x1。我使用
nasm bootloader.asm -o bootloader.img' (bootloader.asm is code that is in main thread). then setting up bootloader.img as floppy in VirtualBox. aboutlodsb` 进行编译,而jc我使用jnc在读取实际成功完成时显示错误消息。 -
你说什么都没打印,我认为这主要是因为你没有设置
lodsb需要的DS寄存器。在启动引导加载程序时,您应该手动设置DS,在这种情况下,它应该设置为0。所以xor ax, ax和mov ds, ax(或任何相当于将0 移动到DS 的东西)肯定会有所帮助。我确实相信您没有看到任何打印的事实很可能是因为 DS 错误(未设置)。您不能依靠 BIOS 跳转到具有正确 DS、ES、SS 和 SP 值的引导加载程序 -
你的扇区号是对的,我已经更改了它并且内核正常打印了消息。我不知道为什么它之前印有“Ä┼╝”,但它现在可以工作了。我真的很感激。
标签: assembly virtualbox nasm x86-16 bootloader