30天自制操作系统Day4
一、intelCPU家谱
8086→80186→286→386→486→Pentium→PentiumPro→PentiumⅡ→PentiumⅢ→Pentium4→…
二、C语言指针和数组的理解
char *p; //用于BYTE类地址
short *p; //用于WORD类地址
int *p; //用于DWOED类地址
最好的理解是这行代码声明了一个地址变量p,p占4字节,但是只知道p是指针变量是不够的,对于地址变量还需要知道p的地址类型,类型不同+1时变量的变化也不同。
char p[4]; //类似于 char *p;
这行代码与上面的意思基本相同,声明了一个数组就是声明了一个char类地址常量p,同时占据了包括该地址变量的十个char型内存,p+1就是在p的基础上加1(一个char),也就是第二个char变量的地址。
这里我们可以得到一个结论,p[i]与*(p+i)的意思完全相同,由于加法可以交换顺序,也可以写成*(i+p)即i[p]。
char p[4][5]; //类似于 char **p;
对于二维数组,p[0]是一个char类地址常量,p的类型是5个char的地址常量,也就是p的步长是5字节(5个char)。p[0]和p的值相同,不同的是他们的类型,所以p[0]+1的值不等于p+1
p[i][j]等同于*(*(p+i)+j)
三、任务条画面显示
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 boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);#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 15void HariMain(void)
{char *vram;int xsize, ysize;init_palette(); //初始化调色板vram = (char *) 0xa0000;xsize = 320;ysize = 200;boxfill8(vram, xsize, COL8_008484, 0, 0, xsize - 1, ysize - 28);//boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 28, xsize - 1, ysize - 28);boxfill8(vram, xsize, COL8_FFFFFF, 0, ysize - 27, xsize - 1, ysize - 27);boxfill8(vram, xsize, COL8_C6C6C6, 0, ysize - 26, xsize - 1, ysize - 1);boxfill8(vram, xsize, COL8_FFFFFF, 3, ysize - 24, 59, ysize - 24);boxfill8(vram, xsize, COL8_FFFFFF, 2, ysize - 24, 2, ysize - 4);boxfill8(vram, xsize, COL8_848484, 3, ysize - 4, 59, ysize - 4);boxfill8(vram, xsize, COL8_848484, 59, ysize - 23, 59, ysize - 5);boxfill8(vram, xsize, COL8_000000, 2, ysize - 3, 59, ysize - 3);boxfill8(vram, xsize, COL8_000000, 60, ysize - 24, 60, ysize - 3);boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 24, xsize - 4, ysize - 24);boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 23, xsize - 47, ysize - 4);boxfill8(vram, xsize, COL8_FFFFFF, xsize - 47, ysize - 3, xsize - 4, ysize - 3);boxfill8(vram, xsize, COL8_FFFFFF, xsize - 3, ysize - 24, xsize - 3, ysize - 3);for (;;) {io_hlt();}
}void init_palette(void)
{static unsigned char table_rgb[16 * 3] = {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(0, 15, table_rgb);return;/* 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[0] / 4); //除以4是为了增加颜色的亮度,否则其中的后8种颜色很难与黑色区分io_out8(0x03c9, rgb[1] / 4);io_out8(0x03c9, rgb[2] / 4);rgb += 3;}io_store_eflags(eflags); /* 割り込み許可フラグを元に戻す */return;
}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;
}
naskfunc.nas
; naskfunc
; TAB=4[FORMAT "WCOFF"] ; オブジェクトファイルを作るモード
[INSTRSET "i486p"] ; 486の命令まで使いたいという記述
[BITS 32] ; 32ビットモード用の機械語を作らせる
[FILE "naskfunc.nas"] ; ソースファイル名情報GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihltGLOBAL _io_in8, _io_in16, _io_in32GLOBAL _io_out8, _io_out16, _io_out32GLOBAL _io_load_eflags, _io_store_eflags[SECTION .text]_io_hlt: ; void io_hlt(void);HLTRET_io_cli: ; void io_cli(void);CLIRET_io_sti: ; void io_sti(void);STIRET_io_stihlt: ; void io_stihlt(void);STIHLTRET_io_in8: ; int io_in8(int port);MOV EDX,[ESP+4] ; portMOV EAX,0IN AL,DX ; 将端口号为DX的设备中的值写入ALRET_io_in16: ; int io_in16(int port);MOV EDX,[ESP+4] ; portMOV EAX,0IN AX,DXRET_io_in32: ; int io_in32(int port);MOV EDX,[ESP+4] ; portIN EAX,DXRET_io_out8: ; void io_out8(int port, int data);
;当调用函数时,参数指定的数字会存放在内存里,ESP为栈指针寄存器,函数参数的数字会按顺序存放在内存地址的[ESP+4]、[ESP+8]、[ESP+12]、……MOV EDX,[ESP+4] ; portMOV AL,[ESP+8] ; dataOUT DX,AL ; 将AL里面值写入端口号为DX的设备RET_io_out16: ; void io_out16(int port, int data);MOV EDX,[ESP+4] ; portMOV EAX,[ESP+8] ; dataOUT DX,AXRET_io_out32: ; void io_out32(int port, int data);MOV EDX,[ESP+4] ; portMOV EAX,[ESP+8] ; dataOUT DX,EAXRET_io_load_eflags: ; int io_load_eflags(void);PUSHFD ; PUSH EFLAGS という意味POP EAXRET_io_store_eflags: ; void io_store_eflags(int eflags);MOV EAX,[ESP+4]PUSH EAXPOPFD ; POP EFLAGS という意味RET
30天自制操作系统Day4相关推荐
- 为什么《30天自制操作系统》封面中的猫是两只尾巴
刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...
- 发布在《30天自制操作系统》之前的帮助阅读贴
说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...
- 写在《30天自制操作系统》上市之前
这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...
- 《30天自制操作系统》笔记(04)——显示器256色
<30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...
- 《30天自制操作系统》学习笔记--第好多天
之前看<30天自制操作系统>,参考而成,和书中系统并不完全一致,是在原有基础上按照自己的习惯而成,由于水平和工作原因,未完成内存管理和文件系统,有兴趣者可以通过以下网址https://gi ...
- 由《30天自制操作系统》引发的漫画创作
大家可还记得<30天自制操作系统>的封面上的那只猫吗?记得当时,在果壳网有人问,为何这只猫长了两只尾巴呢,延着这条线,我把这本书捧上了展示的舞台.事隔四个多月,我又重提此书. 这本经我手宣 ...
- 30天自制操作系统——第二十三天窗口操作
窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...
- 30天自制操作系统-初体验
最近在图书馆翻阅关于操作系统的书籍,看到川和秀实的自制操作系统决定也动手尝试一下,这本书书名就叫做30天自制操作系统.首先还是附上光盘镜像的获取地址吧.30天自制操作系统光盘镜像ISO完整版下载 - ...
最新文章
- 读后感和机翻《他们在看哪里,为什么看?在复杂的任务中共同推断人类的注意力和意图》
- 蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践
- jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点
- 数据结构实验之栈与队列七:出栈序列判定
- mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position
- 图解springmvc 执行流程
- 【译】索引进阶(四):页和区
- rssi定位算法 c语言,【论文※】An RSSI Gradient-based AP Localization Algorithm 基于RSSI梯度的AP定位算法...
- JUC:ReentrantLock互斥锁
- Windows和VMware下ubuntu切换界面的快捷键
- Silverligth out of browser OOB应用安装卸载说明
- 【解决】Ubuntu安装NVIDIA驱动(咨询NVIDIA工程师的解决方案)
- 极客大学架构师训练营 框架开发 设计原则 设计模式 反应式编程框架 上课总结 第五课
- 打印机扫描到计算机,打印机扫描文件到电脑方法教程
- Google 2017 上海开发者大会 总结
- Java基础进阶Day04
- selenium定位H5表单验证的提示语
- mysql 统计日活_所谓的日活、月活是如何记录与统计的?
- 基本极限定理(切比雪夫不等式,大数定律,中心极限定理)
- Virgin Voyages将提供按需香槟配送服务“Shake for Champagne™”