boot.asm代码:
[org 0x7c00]
KERNEl_ADDR equ 0x820;数据要加载到0x8200:0000处(姑且当作是内核)
mov bx,LOADING_STR
call print_str;输出loading...字符串,bx是字符串地址参数
mov ah,0x02;2h代表读盘
mov al,1;读一个扇区
mov ch,0;0柱面
mov dh,0;0磁头
mov cl,2;2扇区
mov dl,0;0号驱动器
mov ax,KERNEl_ADDR
mov es,ax;数据最终加载到es:bx处
mov bx,0
int 13h;读取磁盘到内存
jnc readDisk_successful;如果读取成功CF标志为置0
jmp readDisk_error;读取失败,输出信息
loop:
jmp loop
readDisk_successful:
mov bx,READ_DISK_SUCCESS
call print_str
jmp loop
readDisk_error:
mov bx,READ_DISK_ERROR
call print_str
jmp loop
print_str:;和上一个程序不同,这次我讲输出字符串的程序改成了一个函数
mov ah,0x0e
mov bp,bx
mov al,[bp]
cmp al,0
jz return
int 10h
add bx,1
jmp print_str
return:
ret
LOADING_STR:
db "loading...",13,10,0
READ_DISK_SUCCESS:
db "read disk successful!",13,10,0
READ_DISK_ERROR:
db "read disk error!",13,10,0
times 510-($-$$) db 0
dw 0x55aa
times 510 db 0
dw 0x55aa
编译指令:
nasm boot.asm -f bin -o boot.img
Virtual Box 运行结果:
参考:
BIOS int 13h功能参数表
BIOS int 10h功能参数表