码迷,mamicode.com
首页 > 其他好文 > 详细

30天自制操作系统(第二天)

时间:2014-12-29 00:50:13      阅读:964      评论:0      收藏:0      [点我收藏+]

标签:

一些基础概念:

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,msg

putloop:
    MOV     AL,[SI]     
    ADD     SI,1          ;给SI加1
    CMP      AL,0
    JE       fin
    MOV      AH,0x0e     ;显示一个文字
    MOV      BX,15       ;指定字符颜色
    INT      0x10        ;调用显卡BIOS
    JMP      putloop

fin:
    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天自制操作系统(第二天)

标签:

原文地址:http://www.cnblogs.com/wolf940509/p/4190837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!