首页 > 代码库 > 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天自制操作系统(第二天)