harib01a:
  P65 用C语言实现内存写入 实现一个往黑画面上写入东西的函数
  修改了naskfunc.nas中的内容
  在bootpack.c中 用write_mem8()函数将VRMA中全部写入了15
  显示的全部像素的颜色为第15种颜色(白色)可以试着修改

;naskfunc.nas中添加的内容
_write_mem8: ; void write_mem8(int addr, int data);
MOV ECX,[ESP+] ; [ESP+4]中存放的是地址,将其读入ECX
MOV AL,[ESP+] ; [ESP+8]中存放的是数据,将其读入AL
MOV [ECX],AL
RET
//bootpack.c
void io_hlt(void);
void write_mem8(int addr, int data); void HariMain(void)
{
int i; /* 定义i位32位的整形数据*/ for (i = 0xa0000; i <= 0xaffff; i++) {
write_mem8(i, ); /* MOV BYTE [i],15 */
} for (;;) {
io_hlt();
}
}

harib01b:
  P67 显示条纹图案
  原理还是一样的,修改bootpack.c中的write_mem8()调用的内容即可
  原理是用i&0xff 可以试试其他的运算(比如或运算)
  书本在这里还将了一点位运算的内容(真是写到那讲到哪啊!我服了)

    for (i = 0xa0000; i <= 0xaffff; i++) {  write_mem8(i, i & 0x0f);  }

harib01c:
  P69 指针进来咯!!!!
  书本首先介绍了用于内存地址的不同长度变量的指针定义:
  char *p; 用于BYTE类型 | short *p; 用于WORD类型 | int *p; 用于DWORD类型

//bootpack.c
void io_hlt(void);
void HariMain(void)
{
int i; /* 变量声明。i是32位的整数 */
char *p; /* 变量P,用于BYTE型的地址 */ for (i = 0xa0000; i <= 0xaffff; i++) { p = i; /* 带入地址 */
*p = i & 0x0f; /* 相当于 write_mem8(i, i & 0x0f) */
} for (;;) {
io_hlt();
}
}

harib01d:
  P74 指针的应用(原理和上面的一样,只是为了说明C语言其他的写法)

    p = (char *) 0xa0000; /* 给指针变量赋值 */
for (i = ; i <= 0xffff; i++) {
*(p + i) = i & 0x0f;
}

harib01e:
  P74 指针的应用(原理和上面的一样,只是为了说明C语言其他的写法)

    p = (char *) 0xa0000; /* 这次赋值的是地址 */
for (i = ; i <= 0xffff; i++) {
p[i] = i & 0x0f;
}

harib01f:
  P75 色号的设定
  文中介绍了制作SOAKA中需要的16中颜色的值;编号为0-15
  其中给bootpack.c添加了颜色的相关的代码
  void init_palette(void);初始化调色板15中颜色
  set_palette(0, 15, table_rgb);设置调色板

//bootpack.c
void io_hlt(void);
void io_cli(void);
void io_out8(int port, int data);
int io_load_eflags(void);
void io_store_eflags(int eflags); /* 函数声明 */ void init_palette(void);
void set_palette(int start, int end, unsigned char *rgb); void HariMain(void)
{
int i; /* i,32位整数 */
char *p; /* P,BYTE型 */ init_palette(); /* 初始化调色板 */ p = (char *) 0xa0000; /* 指定位置 */ for (i = ; i <= 0xffff; i++) {
p[i] = i & 0x0f;
} for (;;) {
io_hlt();
}
} void init_palette(void)
{
static unsigned char table_rgb[ * ] = {
0x00, 0x00, 0x00, /* 0:黑 */
0xff, 0x00, 0x00, /* 1:亮红*/
0x00, 0xff, 0x00, /* 2:亮绿 */
0xff, 0xff, 0x00, /* 3:亮黄 */
0x00, 0x00, 0xff, /* 4:亮蓝 */
0xff, 0x00, 0xff, /* 5:亮紫 */
0x00, 0xff, 0xff, /* 6:浅亮蓝 */
0xff, 0xff, 0xff, /* 7:白 */
0xc6, 0xc6, 0xc6, /* 8:亮灰色 */
0x84, 0x00, 0x00, /* 9:暗红色 */
0x00, 0x84, 0x00, /* 10:暗绿色 */
0x84, 0x84, 0x00, /* 11:暗黄色 */
0x00, 0x00, 0x84, /* 12:暗青色 */
0x84, 0x00, 0x84, /* 13:暗紫色 */
0x00, 0x84, 0x84, /* 14:浅暗蓝 */
0x84, 0x84, 0x84 /* 15:暗灰色 */
};
set_palette(, , table_rgb);
return; /* C语言中的static char只能用于数据,相当于汇编语言中的DB的用法 */
} void set_palette(int start, int end, unsigned char *rgb)
{
int i, eflags;
eflags = io_load_eflags(); /* 记录中断号 */
io_cli(); /* 中断号置0,禁止中断 */
io_out8(0x03c8, start);
for (i = start; i <= end; i++) {
io_out8(0x03c9, rgb[] / );
io_out8(0x03c9, rgb[] / );
io_out8(0x03c9, rgb[] / );
rgb += ;
}
io_store_eflags(eflags); /* 中断复原 */
return;
}
; naskfunc.nas
; TAB=4 [FORMAT "WCOFF"] ; 制作目标文件的模式
[INSTRSET "i486p"] ; 使用486为止的指令
[BITS ] ; 制作32位模式用的机器语言
[FILE "naskfunc.nas"] ; 源文件名 GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt
GLOBAL _io_in8, _io_in16, _io_in32
GLOBAL _io_out8, _io_out16, _io_out32
GLOBAL _io_load_eflags, _io_store_eflags [SECTION .text] _io_hlt: ; void io_hlt(void);
HLT
RET _io_cli: ; void io_cli(void);
CLI
RET _io_sti: ; void io_sti(void);
STI
RET _io_stihlt: ; void io_stihlt(void);
STI
HLT
RET _io_in8: ; int io_in8(int port);
MOV EDX,[ESP+] ; port
MOV EAX,
IN AL,DX
RET _io_in16: ; int io_in16(int port);
MOV EDX,[ESP+] ; port
MOV EAX,
IN AX,DX
RET _io_in32: ; int io_in32(int port);
MOV EDX,[ESP+] ; port
IN EAX,DX
RET _io_out8: ; void io_out8(int port, int data);
MOV EDX,[ESP+] ; port
MOV AL,[ESP+] ; data
OUT DX,AL
RET _io_out16: ; void io_out16(int port, int data);
MOV EDX,[ESP+] ; port
MOV EAX,[ESP+] ; data
OUT DX,AX
RET _io_out32: ; void io_out32(int port, int data);
MOV EDX,[ESP+] ; port
MOV EAX,[ESP+] ; data
OUT DX,EAX
RET _io_load_eflags: ; int io_load_eflags(void);
PUSHFD ; PUSH EFLAGS
POP EAX
RET _io_store_eflags: ; void io_store_eflags(int eflags);
MOV EAX,[ESP+]
PUSH EAX
POPFD ; POP EFLAGS
RET

harib01g:
  P84 绘制矩形
  运用坐标的关系,改变像素的颜色,在VRAM中绘制矩形
  编写的函数为boxfill8 绘制相关的矩形

#define COL8_000000        0
#define COL8_FF0000 1
#define COL8_00FF00 2
#define COL8_FFFF00 3
#define COL8_0000FF 4
#define COL8_FF00FF 5
#define COL8_00FFFF 6
#define COL8_FFFFFF 7
#define COL8_C6C6C6 8
#define COL8_840000 9
#define COL8_008400 10
#define COL8_848400 11
#define COL8_000084 12
#define COL8_840084 13
#define COL8_008484 14
#define COL8_848484 15 void HariMain(void)
{
char *p; /* P BYTE */ init_palette(); /* 初始化调色板 */ p = (char *) 0xa0000; /* 地址赋值 */ boxfill8(p, , COL8_FF0000, , , , ); //画3个矩形
boxfill8(p, , COL8_00FF00, , , , );
boxfill8(p, , COL8_0000FF, , , , ); for (;;) {
io_hlt();
}
}
.................
void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{
int x, y;
for (y = y0; y <= y1; y++) {
for (x = x0; x <= x1; x++)
vram[y * xsize + x] = c;
}
return;
}

harib01h:
  P86 介绍了任务条(task bar)的显示方法,
  修改HariMain 方法

void HariMain(void)
{
char *vram;
int xsize, ysize; init_palette();
vram = (char *) 0xa0000;
xsize = ;
ysize = ; boxfill8(vram, xsize, COL8_008484, , , xsize - , ysize - );
boxfill8(vram, xsize, COL8_C6C6C6, , ysize - , xsize - , ysize - );
boxfill8(vram, xsize, COL8_FFFFFF, , ysize - , xsize - , ysize - );
boxfill8(vram, xsize, COL8_C6C6C6, , ysize - , xsize - , ysize - ); boxfill8(vram, xsize, COL8_FFFFFF, , ysize - , , ysize - );
boxfill8(vram, xsize, COL8_FFFFFF, , ysize - , , ysize - );
boxfill8(vram, xsize, COL8_848484, , ysize - , , ysize - );
boxfill8(vram, xsize, COL8_848484, , ysize - , , ysize - );
boxfill8(vram, xsize, COL8_000000, , ysize - , , ysize - );
boxfill8(vram, xsize, COL8_000000, , ysize - , , ysize - ); boxfill8(vram, xsize, COL8_848484, xsize - , ysize - , xsize - , ysize - );
boxfill8(vram, xsize, COL8_848484, xsize - , ysize - , xsize - , ysize - );
boxfill8(vram, xsize, COL8_FFFFFF, xsize - , ysize - , xsize - , ysize - );
boxfill8(vram, xsize, COL8_FFFFFF, xsize - , ysize - , xsize - , ysize - ); for (;;) {
io_hlt();
}
}

《30天自制操作系统》04_day_学习笔记的更多相关文章

  1. 《30天自制操作系统》学习笔记--Mac下工具的使用

    现在来介绍官网上下的工具怎么用首先是官网地址,书上有个注释上有:hrb.osask.jp 翻译成中文大概是这个样子滴. 上面有两个文件可以下载,一个是工具,一个是工具的源代码,很好的学习资料 下面把工 ...

  2. 《30天自制操作系统》学习笔记--Mac环境搭建

    弄了三天了,终于弄好了,先说结果,就是作者在网站上放了os x的工具(hrb.osask.jp,也有linux下的工具,可以自己去下载),也就是说我白忙活了三天... 再说一下这几天都干啥了,主要是想 ...

  3. 《30天自制操作系统》学习笔记--番外篇之Mac环境下的工具介绍

    这几天又有点不务正业了,书也没看,一直在搞这个破环境,尝试各种做法,网上各种垃圾信息,浪费了很多时间,说的基本都是废话,不过还是找到了一些,赶紧写下来,不然这个过几天又忘了 首先是环境,我用的是Max ...

  4. 《30天自制操作系统》读书笔记(5) GDT&IDT

    梳理项目结构 项目做到现在, 前头的好多东西都忘了, 还是通过Makefile重新理解一下整个项目是如何编译的: 现在我们拥有这么9个文件: ipl10.nas    InitialProgramLo ...

  5. 《30天自制操作系统》读书笔记(3) 引入C语言

    这一次的学习相当曲折, 主要是因为粗心, Makefile里面的错误导致了文件生成出现各种奇奇怪怪的问题, 弄得心力交瘁, 因此制作过程还是尽量按着作者的路子来吧. 作者提供的源码的注释在中文系统下是 ...

  6. 《30天自制操作系统》读书笔记(2)hello, world

    让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实 ...

  7. 30天自制操作系统第九天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第九天的课程已学完,确实有点不想写 ...

  8. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

  9. 30天自制操作系统第八天学习笔记(u盘软盘双启动版本)

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 environment:开发环境:ubuntu 第八天的学习思考: 关于鼠标是怎么 ...

  10. 《30天自制操作系统》笔记(03)——使用Vmware

    <30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...

随机推荐

  1. ip sevices

    http://www.ip138.com/ip2city.asp http://www.bliao.com/ip.phtml http://www.whereismyip.com/ http://ww ...

  2. Solr 连接数据库

    实际工程应用中,从数据库导出数据创建索引再常见不过了,现在实验一下从数据库导入数据创建索引. 一.版本说明 Solr版本:4.7.0 数据库:sqlserver2005 二.配置步骤 1.  准备的j ...

  3. 【转载】在LoadRunner中执行命令行程序之:popen()取代system()

    我想大家应该都知道在LoadRunner可以使用函数system()来调用系统指令,结果同在批处理里执行一样. 但是system()有个缺陷:无法获取命令的返回结果. 也许你可以用`echo comm ...

  4. BAT批处理(二)

    在前一篇中已对BAT批处理基础作了一些总结,但是对于BAT批处理还有很多的知识点没有讲解到,比如DOS中的特殊符号:IF.FOR的使用:变量:更多的DOS命令等等.本文在前一篇的基础上继续对BAT批处 ...

  5. VC 中 UpdateData() 函数的使用

    UpdateData(FALSE)与UpdateData(TRUE)是相反的过程 UpdateData(FALSE)是把程序中改变的值更新到控件中去 UpdateData(TRUE)是把在控件中输入的 ...

  6. nrf51822裸机教程-GPIOTE

    GPIO通常都会具有中断功能,上一讲的GPIO中并没有涉及到中断的相关寄存器. 51822将GPIO的中断相关做成了一个单独的模块GPIOTE,这个模块不仅提供了GPIO的中断功能,同时提供了 通过t ...

  7. docker learning

    Docker 配置文件位置 Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致 在 ubuntu 中的位置是:/etc/default/docker 在 cento ...

  8. java多线程编程(一基础概念)

    1.进程和线程       进程,是一个正在运行的程序实体,windows下常见的就是xxx.exe,在任务管理器中可以看见很多个进程.它是线程的容器. 线程,是进程中的一个执行流.在单线程编程中,我 ...

  9. php--数据库三范式

    关系数据库的几种设计范式介绍1.第一范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据 ...

  10. Asp.net MVC23 使用Areas功能的常见错误

    一般WEB项目都会不同的页面区域,如:用户前台.用户后台.管理员后台. 访问的URL: 用户前台:www.domain.com/home/index 用户后台:www.domain.com/admin ...