自己动手写操作系统(1):一个最小的“操作系统”(转载备用)

When Do We Write Our Chinese OS ?

开始前的说明:本系列依据于《一个操作的实现》

之前在ubuntu下bochs安装使用已经开始了这个系列,那篇文章算是初始环境的一个搭建。下面针对这篇文章的程序进行说明。

	org	07c00h			; 告诉编译器程序加载到7c00处
	mov	ax, cs
	mov	ds, ax
	mov	es, ax
	call	DispStr			; 调用显示字符串例程
	jmp	$			; 无限循环
DispStr:
	mov	ax, BootMessage
	mov	bp, ax			; ES:BP = 串地址
	mov	cx, 16			; CX = 串长度
	mov	ax, 01301h		; AH = 13,  AL = 01h
	mov	bx, 000ch		; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
	mov	dl, 0
	int	10h			; 10h 号中断
	ret
BootMessage:		db	"Hello, OS world!"
times 	510-($-$$)	db	0	; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 	0xaa55				; 结束标志

通过nasm编译代码,如下:
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ nasm boot.asm -o boot.bin
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ ls
boot.asm  boot.bin

接下来通过bochs的bximage创建一张软盘:
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ bximage
========================================================================
bximage
Disk Image Creation Tool for Bochs
$Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

Choose the size of floppy disk image to create, in megabytes.
Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44]
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560

What should I name the image?
[a.img]

Writing: [] Done.

I wrote 1474560 bytes to a.img.

The following line should appear in your bochsrc:
floppya: image=”a.img”, status=inserted
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ ls
a.img boot.asm boot.bin
接下来将编译的软件写入软盘:
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$ dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
记录了1+0 的读入
记录了1+0 的写出
512字节(512 B)已复制,5.2399e-05 秒,9.8 MB/秒
brieftime@brieftime-computer:~/Program/Project/OS/chapter1/a$
最后一步就是启动bochs,但是启动之前需要通过配置文件对bochs的参数进行配置,举例如下:
###############################################################
# Configuration file for Bochs
###############################################################

# how much memory the emulated machine will have
megs: 32

# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest

# what disk images will be used
floppya: 1_44=a.img, status=inserted

# choose the boot disk.
boot: floppy

# where do we send log messages?
# log: enabled=0

# disable the mouse
mouse: enabled=0

# enable key mapping, using US layout as default.
keyboard_mapping: enabled=0, map=/usr/local/share/bochs/keymaps/x11-pc-us.map

在命令行下输入bochs:


下面对代码进行说明:
前面几行将ds和es两个段寄存器ds和es指向与cs相同的段,以便后面调用INT 10H中断的时候定位到正确位置。
这里对INT 10H功能简要说明:
INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序,使用 INT 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 INT 10H。底下是它们的说明:

AH
功 能
调用参数
返回参数 / 注释
1
 置光标类型
(CH)0―3 = 光标开始行
(CL)0―3 = 光标结束行
 
2
 置光标位置
BH = 页号
DH = 行
DL = 列
 
3
 读光标位置
BH = 页号
CH = 光标开始行
CL = 光标结束行
DH = 行
DL = 列
4
   读光笔位置
 
AH=0 光笔未触发
=1 光笔触发
CH=象素行
BX=象素列
DH=字符行
DL=字符列
5
 显示页
AL = 显示页号
 
6
 屏幕初始化或上卷
AL = 上卷行数
AL =0全屏幕为空白
BH = 卷入行属性
CH = 左上角行号
CL = 左上角列号
DH = 右下角行号
DL = 右下角列号
 
7
 屏幕初始化或下卷
AL = 下卷行数
AL = 0全屏幕为空白
BH = 卷入行属性
CH = 左上角行号
CL = 左上角列号
DH = 右下角行号
DL = 右下角列号
 
8
 读光标位置的属性和字符
BH = 显示页
AH = 属性
AL = 字符
9
 在光标位置显示字符及其属性
BH = 显示页
AL = 字符
BL = 属性
CX = 字符重复次数
 
A
 在光标位置只显示字符
BH = 显示页
AL = 字符
CX = 字符重复次数
 
E
 显示字符(光标前移)
AL = 字符
BL = 前景色
光标跟随字符移动
13
 显示字符串
ES:BP = 串地址
CX = 串长度
DH, DL = 起始行列
BH = 页号
AL = 0,BL = 属性
串:Char,char,……,char
AL = 1,BL = 属性
串:Char,char,……,char
AL = 2
串:Char,attr,……,char,attr
AL = 3
串:Char,attr,……,char,attr

光标返回起始位置

光标跟随移动

光标返回起始位置

光标跟随串移动








本文是转载http://www.brieftime.net/articles/1639的,我将其收集起来是为了方便以后阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值