源代码如下:
mov ax,0600h;
mov bx,0700h;
mov cx,0;
mov dx,0184fh;
int 10h;
mov ax,0200h;
mov bx,0000h;
mov dx,0000h;
int 10h;
org 07c00h;
mov ax,cs;
mov ds,ax;
mov es,ax;
call stringShow;
jmp $;
stringShow:
mov ax,beginString;
mov bp,ax;
mov cx,9;
mov ax,01301h;
mov bx,000ch;
mov dl,0;
int 10h;
ret;
beginString: db "Hello OS!";
times 510-($-$$) db 0;
dw 0xaa55;
上边的代码使用vim或者其他编辑器保存成boot.asm
文件。
bochsrc
文件内容如下:
# configuration file generated by Bochs
plugin_ctrl: unmapped=true, biosdev=true, speaker=true, extfpuirq=true, parallel=true, serial=true
config_interface: textconfig
#display_library: x
# gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
magic_break: enabled=1
display_library: x
#, options="gui_debug"
memory: host=32, guest=32
romimage: file="/usr/local/share/bochs/BIOS-bochs-latest", address=0x00000000, options=none
vgaromimage: file="/usr/local/share/bochs/VGABIOS-lgpl-latest"
boot: disk
floppy_bootsig_check: disabled=0
# no floppya
floppya: 1_44="boot.img", status=inserted
# no floppyb
ata0: enabled=true, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="./boot.img", mode=flat
ata0-slave: type=none
ata1: enabled=true, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=false
ata3: enabled=false
optromimage1: file=none
optromimage2: file=none
optromimage3: file=none
optromimage4: file=none
optramimage1: file=none
optramimage2: file=none
optramimage3: file=none
optramimage4: file=none
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5, realtime=1
cpu: count=1, ips=4000000, model=bx_generic, reset_on_triple_fault=1, cpuid_limit_winnt=0, ignore_bad_msrs=1, mwait_is_nop=0
cpuid: level=6, stepping=3, model=3, family=6, vendor_string="GenuineIntel", brand_string=" Intel(R) Pentium(R) 4 CPU "
cpuid: mmx=true, apic=xapic, simd=sse2, sse4a=false, misaligned_sse=false, sep=true
cpuid: movbe=false, adx=false, aes=false, sha=false, xsave=false, xsaveopt=false, smep=false
cpuid: smap=false, mwait=true
print_timestamps: enabled=0
# no gdb stub
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=none, time0=local, rtc_sync=0
# no cmosimage
log: -
logprefix: %t%e%d
debug: action=ignore
info: action=report
error: action=report
panic: action=ask
keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none
mouse: type=ps2, enabled=false, toggle=ctrl+mbutton
speaker: enabled=true, mode=system
parport1: enabled=true, file=none
parport2: enabled=false
com1: enabled=true, mode=null
com2: enabled=false
com3: enabled=false
com4: enabled=false
Makefile
文件如下:
bochsSimulate : clean boot.bin boot.img
bochs -f bochsrc
qemuSimulate : clean boot.bin boot.img
qemu-system-x86_64 -fda boot.img
boot.bin : boot.asm
nasm -f bin boot.asm -o boot.bin
boot.img :
bximage -func=create -fd=1.44M -q boot.img
dd if=boot.bin of=./boot.img bs=512 count=1 conv=notrunc
clean :
rm -rf boot.img
rm -rf boot.bin
把boot.asm
、bochsrc
和Makefile
放到同一个目录下,例如下图:
可以使用sudo make bochsSimulate
来让bochs模拟,使用sudo make qemuSimulate
来让qemu模拟。
int 10h
是BIOS(Basic Input And Output System
,基本输入输出系统)中断服务程序。
mov ax,0600h;
mov bx,0700h;
mov cx,0;
mov dx,0184fh;
int 10h;
先来解析这段代码的含义:
BIOS中断程序int 10h
的主功能号ah=06h
可以实现按指定范围向上滚动窗口的功能,同时也具备清屏的功能。
al=滚动的列数,若为0则实现清空屏幕功能。
bh=滚动后空出位置放入的属性,可以设置颜色。
ch=滚动范围的左上角坐标列号
cl=滚动范围的左上角坐标行号
dh=滚动范围的右下角坐标列号
dl=滚动范围的右下角坐标行号
此文章为4月Day 4学习笔记,内容来源于极客时间《操作系统实战 45 讲》。