【发布时间】:2015-06-22 22:27:41
【问题描述】:
在学习汇编的过程中,我正在编写一个操作系统。我已经成功编写了将第二个 512 字节扇区附加到初始 512 字节引导加载程序所需的代码:
%define KBDINT 0x16
%define VIDINT 0x10
%define DISKINT 0x13
%define TTYOUT 0x0E
%define VIDMODE 0x0000
%define NUL 0x00
%define CR 0x0D
%define LF 0x0A
%define START 0x7C00
%macro PRINT 1
mov si, %1
call print
%endmacro
bits 16 ; 16 bit real mode
org START ; loader start in memory
start: jmp main
print: jmp .init
.loop: mov bx, VIDMODE
mov ah, TTYOUT
int VIDINT
inc si
.init: mov al, [si]
cmp al, NUL
jne .loop
ret
main: cli
xor ax, ax
mov ds, ax
mov es, ax
sti
PRINT welcome
mov ah, NUL
int DISKINT
mov al, 0x01 ; sector count
mov ah, 0x02 ; read function
mov bx, kernel
mov cl, 0x02
mov ch, 0x00 ; cylinder number
mov dh, 0x00 ; head number
int DISKINT
jc fail
jmp kernel
fail: PRINT failure
; jmp halt
halt: PRINT halting
cli
hlt
PRINT imprbbl
jmp halt
welcome db "moose os", CR, LF, NUL
failure db "failed disk load", CR, LF, NUL
halting db "halting", CR, LF, NUL
imprbbl db "but that's impossible!", CR, LF, NUL
times 0x0200 - ($ - $$) - 2 db 0x00
end dw 0xAA55
kernel: PRINT yay
yay db "kernel", CR, LF, NUL
jmp halt
times 0xFFFF db 0x00
我编译文件时使用:nasm -f bin -o boot.bin boot.asm && qemu boot.bin:
我很好奇磁头和气缸是如何使用的:
- 扇区是如何迭代的?
- 模拟和直接执行之间的迭代有何不同?
【问题讨论】:
-
图像文件中有那个扇区吗?从您粘贴的来源和命令来看,您甚至没有 2 个扇区,更不用说 3 个了。
-
@Jester hmm lemme try something
-
@Jester 是的,这就是问题所在。我真傻
-
见这里:wiki.osdev.org/…。调用 INT13h AH=8 BIOS 函数以获取“驱动器几何”。然后迭代直到最大值。
-
最好将
jmp halt放在yay db "kernel", CR, LF, NUL之前。现在你执行垃圾,这是一件有风险的事情!
标签: assembly bootloader