首页 > 代码库 > 30天自制操作系统(第二天)
30天自制操作系统(第二天)
一些基础概念:
org指令: 装载到内存的哪个位置
寄存器: AX 累加寄存器 CX 计数寄存器 DX 数据寄存器 BX 基址寄存器 SP 栈指针寄存器 BP 基址指针寄存器 SI 源变址寄存器 DI 目的变址寄存器
BP、SP、SI、DI没有"L"和"H",要进行高低位操作赋值到AX中去进行
把8个寄存器全部合起来也才只有16个字节,换句话说,就算我们把这8个寄存器都用上,CPU也只能存储区区16个字节。
MOV SI,msg 把msg对应的数字送到SI中去(标号对应的数字是org以后算出来的)
内存是CPU的外部存储器
MOV BYTE[678],123 内存的678号地址来保存123
相邻字节,相邻是按照地址递增的顺序
只有BX,BP,SI,DI可以被用来指定内存,AX,CX,DX,SP不能用来指定内存地址,因为CPU没有处理这种指令的电路
想把DX内容赋给内存 MOV BX,DX MOV AL,BYTE[BX]
MOV 源和目的位数必须相同
BIOS 基本输入输出系统 INT 0x10 ;控制显卡
BIOS的一个网页:
http://community.osdev.info/?(AT)BIOS
显示一个字符: AH=0x0e AL=character code BH=0 BL=color code
按照以上步骤,往寄存器里面送入各种值在调用INT 0x10就显示出来了
HLT 让CPU停止(不是真正停止),让CPU进入待机状态
内存分布图: http://community.osdev.info/?(AT)memorymap
0x00007c00——0x00007dff ;启动区内容装载地址
;hello-os;TAB=4 ORG 0X7C00 ;指明程序的装载地址 ;以下这段是标准FAT12格式软盘专用代码 JMP entry DB 0x90 DB "HELLOIPL" ;启动扇区的名称可以使任意的字符串 DW 512 ;每个扇区的大小(必须为512字节) DB 1 ;簇的大小(必须为1个扇区) DW 1 ;FAT的起始位置(一般从第一个扇区开始) DB 2 ;FAT的个数(必须为2) DW 224 ;根目录的大小(一般设置为224) DW 2880 ;该磁盘的大小(必须是2880扇区) DB 0xf0 ;磁盘的种类(必须是0xf0) DW 9 ;FAT的长度(必须是9扇区) DW 18 ;1个磁道有几个扇区(必须是18) DW 2 ;磁头数(必须是2) DD 0 ;不试用分区(必须是0) DD 2880 ;重写一次磁盘大小 DB 0,0,0x29 ;固定 DD 0xffffffff ;(可能是)卷码标号 DB "HELLO-OS " ;磁盘的名称(11字节) DB "FAT12 " ;磁盘格式的名称(8字节) RESB 18 ;先空出18字节;程序核心entry: MOV AX,0 ;初始化寄存器 MOV SS,AX MOV SP,0x7c00 MOV DS,AX MOV ES,AX MOV SI,msgputloop: MOV AL,[SI] ADD SI,1 ;给SI加1 CMP AL,0 JE fin MOV AH,0x0e ;显示一个文字 MOV BX,15 ;指定字符颜色 INT 0x10 ;调用显卡BIOS JMP putloopfin: HLT ;让CPU停止循环,等待指令 JMP fin ;无限循环msg: DB 0X0a,0X0a ;换行两次 DB "hello,world" DB 0x0a DB 0 RESB 0x7dfe-$ ;填写0x00,直到0x001fe DB 0x55, 0xaa;以下是启动区以外部分的输出 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
30天自制操作系统(第二天)