我正在用实模式 ASM 编写一个简单的操作系统,以获得它的乐趣。我最近决定转向文件系统。我组装了代码
nasm -f bin -o boot.o boot.asm
nasm -f bin -o kernel.o kernel.asm
nasm -f bin -o fs.o fs.asm
dd if=boot.o bs=512 of=os.img
dd if=kernel.o bs=512 of=os.img seek=1
dd if=fs.o bs=512 of=os.img seek=2
在我的引导加载程序中,我将文件系统加载到地址 0x1000:0000,将内核加载到 0x2000:0000。每个都是 512 字节(到目前为止)相当小。因此,为了测试我的新文件系统,我编写了内核来打印表中第一个文件名的第一个字母。它将值 0x2000 放入 si 中,将 si 中地址处的字节移动到 al 中。然后它将 0x0e 传递给 ah 并调用 int 0x10。然后它停止。但是,当我将操作系统引导到 qemu 时,它只是向我显示 BIOS 信息,说从软盘引导,然后什么也不做。没有信。没有什么。以下是相关代码:
相关引导加载程序代码
;;the part that loads the file system.
;;The part for the kernel is identical, except that cl is 02 and bx is 0x2000
mov ah, 02
mov al, 01
mov ch, 00
mov cl, 03
mov dh, 00
mov dl, 00
mov bx, 0x1000
mov es, bx
xor bx, bx
int 0x13
;;jumps to address 0x2000 (where the kernel is)
mov ax, 0x2000
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
xor ax, ax
jmp 0x2000
;;halts
hlt
相关内核代码
;;gets address
mov si, 0x1000
;;loads al
mov al, [si]
;;prints
mov ah, 0x0e
int 0x10
;;halts
hlt
相关文件系统代码
;;declares first file (it is hard coded for testing purposes)
;;format: [name], [sector number], [number of sectors to load]
db 'file.bin', 4, 1
如果我在发布此内容时做错了什么,请原谅我,因为这是我的第一篇文章。