简介
实验 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
mov ax, 0xb800
mov gs,ax
; 清屏利用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
; 写入显存
mov byte [gs:0x00], '1';
mov byte [gs:0x01], 0xA4;
mov byte [gs:0x02], ' ';
mov byte [gs:0x03], 0xA4;
mov byte [gs:0x04], 'M';
mov byte [gs:0x05], 0xA4;
mov byte [gs:0x06], 'B';
mov byte [gs:0x07], 0xA4;
mov byte [gs:0x08], 'R';
mov byte [gs:0x09], 0xA4;
jmp $
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