简介
实验 1:编写 mbr,在屏幕上显示字符。
代码
boot/mbr.s
; boot/mbr.s
; 功能:在屏幕上显示字符
SECTION MBR vstart=0x7c00
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov sp,0x7c00
; 清屏利用0x06号功能,上卷全部行,则可清屏。
; 输入:
; AH 功能号=0x06
; AL = 上卷的行数(如果为0,表示全部)
; BH = 上卷行属性
; (CL,CH) = 窗口的左上角的(X,Y)位置
; (DL,DH) = 窗口的右上角的(X,Y)位置
; 无返回值:
mov ax,0x600
mov bx,0x700
mov cx,0
mov dx,0x184f
int 0x10
; 获取光标位置
; 输入:
; ah 功能号3
; bh 页号
; 输出:
; ch=光标开始行
; cl=光标结束行
; dh=光标所在行号
; dl=光标所在列号
mov ah,3
mov bh,0
int 0x10
; 调用13号子功能打印字符串
; 输入:
; ah 功能号13
; al设置写字符方式 ah=01:显示字符串,光标跟随移动
; bh设置要显示的页号,此处是第0页
; ;bl中是字符属性,属性是黑底绿字(bl=02h)
; es:bp为串首地址
; cx为串长度,不包括结束符0
mov ax,message
mov bp,ax
mov ax,0x1301
mov bx,0x2
mov cx,9
int 0x10
jmp $
message db "hello mbr"
times 510-($-$$) db 0
db 0x55,0xaa
编译
Makefile
BUILD_DIR = ./build
.PHONY : mk_dir bootloader clean all
mk_dir: #创建build目录
if [ ! -d $(BUILD_DIR) ]; then mkdir $(BUILD_DIR); fi
bootloader: #编译启动内核的文件 bootloader
nasm -I include/ -o $(BUILD_DIR)/mbr.bin boot/mbr.s
dd if=/home/c/tityos/build/mbr.bin of=/home/c/tityos/hd60M.img bs=512 count=1 conv=notrunc
clean: #删除build目录里的全部文件
cd $(BUILD_DIR) && rm -f ./*
# 创建build目录。编译启动内核的文件。
all: mk_dir bootloader
运行
start.sh
# !/bin/bash
# 功能:启动bochs
bin/bochs -f bochsrc.disk