一、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相关推荐

  1. 为什么《30天自制操作系统》封面中的猫是两只尾巴

    刚刚在一社区,发了一贴,被指出一问题,询一高人,得一答案.这便是我没有关注到的封面上的那只猫,我想这也是很多读者没有关注到的.因为在我微博的200转发贴中,并没有人提到封面中的猫为何有两只尾巴.于是咨 ...

  2. 发布在《30天自制操作系统》之前的帮助阅读贴

    说明:这是8月15日即将上市的一本新书,本文的摘选也可以命名为<30天自制操作系统>上市之前必读.本书幽默,有趣,可以说是技术书里的幽默书,让您读起来绝对不会感到乏味.在本书上市之前,您一 ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)--hello bitzhuwei's OS! 最初的OS代码 1 ; hello-os 2 ; TAB=4 3 4 ORG 0x7c00 ; 指明程序的 ...

  4. 写在《30天自制操作系统》上市之前

       这本<30天自制操作系统>马上就要在各大书店和网上商城全面上架了,作为本书的4位译者之一,我负责翻译了本书约三分之二的内容.这是我参与翻译的第一本译著,我感到很激动也很紧张,因为我知 ...

  5. 《30天自制操作系统》笔记(04)——显示器256色

    <30天自制操作系统>笔记(04)--显示器256色 进度回顾 从最开始的(01)篇到上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题. 本篇做一个小练习:设置显卡显示256色. ...

  6. 《30天自制操作系统》学习笔记--第好多天

    之前看<30天自制操作系统>,参考而成,和书中系统并不完全一致,是在原有基础上按照自己的习惯而成,由于水平和工作原因,未完成内存管理和文件系统,有兴趣者可以通过以下网址https://gi ...

  7. 由《30天自制操作系统》引发的漫画创作

    大家可还记得<30天自制操作系统>的封面上的那只猫吗?记得当时,在果壳网有人问,为何这只猫长了两只尾巴呢,延着这条线,我把这本书捧上了展示的舞台.事隔四个多月,我又重提此书. 这本经我手宣 ...

  8. 30天自制操作系统——第二十三天窗口操作

    窗口及输入切换 我们先来实现用键盘切换窗口,按下F11键,将最下面的窗口移动到最上面,这里F11按键的编码为0x57. bootpack.c节选: void HariMain(void) {(略)fo ...

  9. 30天自制操作系统-初体验

    最近在图书馆翻阅关于操作系统的书籍,看到川和秀实的自制操作系统决定也动手尝试一下,这本书书名就叫做30天自制操作系统.首先还是附上光盘镜像的获取地址吧.30天自制操作系统光盘镜像ISO完整版下载 - ...

最新文章

  1. 读后感和机翻《他们在看哪里,为什么看?在复杂的任务中共同推断人类的注意力和意图》
  2. 蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践
  3. jvm性能调优 - 15JVM的老年代垃圾回收器CMS的缺点
  4. 数据结构实验之栈与队列七:出栈序列判定
  5. mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position
  6. 图解springmvc 执行流程
  7. 【译】索引进阶(四):页和区
  8. rssi定位算法 c语言,【论文※】An RSSI Gradient-based AP Localization Algorithm 基于RSSI梯度的AP定位算法...
  9. JUC:ReentrantLock互斥锁
  10. Windows和VMware下ubuntu切换界面的快捷键
  11. Silverligth out of browser OOB应用安装卸载说明
  12. 【解决】Ubuntu安装NVIDIA驱动(咨询NVIDIA工程师的解决方案)
  13. 极客大学架构师训练营 框架开发 设计原则 设计模式 反应式编程框架 上课总结 第五课
  14. 打印机扫描到计算机,打印机扫描文件到电脑方法教程
  15. Google 2017 上海开发者大会 总结
  16. Java基础进阶Day04
  17. selenium定位H5表单验证的提示语
  18. mysql 统计日活_所谓的日活、月活是如何记录与统计的?
  19. 基本极限定理(切比雪夫不等式,大数定律,中心极限定理)
  20. Virgin Voyages将提供按需香槟配送服务“Shake for Champagne™”

热门文章

  1. Java 学习笔记 字面量
  2. Windows批量合成csv文件
  3. 关于stm32通信协议:软件模拟SPI、软件模拟I2C的总结(fishing_8)
  4. 实用解决Python作用域问题
  5. (十)RHEL系统之基于LAMP架构部署商城系统
  6. 万得凯上市首日跌14%:募资近10亿 公司市值34亿
  7. 长旋转椭球坐标系基础
  8. 不让IE浏览器打开后跳转到edge
  9. python优点以及领域
  10. 当哪种公司做什么性质的销售才能够拿到高工资的探讨