书还不错,下载下来看了下,能看个一知半解,索性决定读完一次试试,原书的代码注释是日文版的,有个群252617052,群主已经将日文翻译过来了,配合着书看看,也挺好的。
涉及到汇编的很多东西,看了又忘了,用笔记记一下吧。
第4天。
CLI(clear interrupt flag)将中断标志置0
STI(set interrupt flag)将中断标志置1
当cpu遇到中断请求时,立即处理中断请求(中断标记为1),还是忽略中断(标记为0)
ELFAGS寄存器,存储的是进位标志和中断标志
在画矩形的时候,自作聪明的重写了fillbox函数,结果不小心把x,y弄反了,导致画出来的图形总是颠倒的,弄了半天才发现问题。
第5天,涉及到中断操作
GDT和IDT
GDT是global segmentdescriptor table全局段号记录表。将这些数据整齐的排列在内存的某个地方,然后将内存的起始地址和有效设定个数放在cpu内被称为GDTR的特殊寄存器中就可以了。
IDT是中断记录表。
第六天
init_gdtidt();/* 初始化GDT, IDT */
init_pic(); /* 初始化PIC */
io_sti(); /* 打开所有可屏蔽中断 */
这三句代码写反了,结果。。。
这三句没有注意,哎,调试了一个晚上,不停地对照,各种问题
第七天
在输出键盘相应信息时,应该这样调用:
boxfill8(binfo->vram, binfo->scrnx, COL8_008484, 0, 16, 15, 31);
putfonts8_asc(binfo->vram,binfo->scrnx,0,16,COL8_FFFFFF,s);
结果自作聪明的省去了boxfill8这个函数,直接输出了putfonts_anc,因为没有重新绘制背景,所以所有的字符全部重叠在一起,笨死了。
同样在最后的代码中,添加鼠标响应之后,
if((fifo8_status(&keyinfo)+ fifo8_status(&mouseinfo))==0)
有这么一句,本意是当鼠标和键盘的缓冲区中都没有数据时,此时无事可做,只能先开中断,在hlt。但是我又傻傻的根据做acm的经验,把+写成了||,然后很悲剧的没有得到鼠标的信息。
在主函数中,因为复制的关系,多写了一次
init_keyboard();
enable_mouse();
结果发现第一字节的数据跑到第二字节上了。。。郁闷了半天.
第十天
前几天的内容基本上每次手动修改都会多多少少出现些问题,不过有了之前几次很蛋碎的经验之后,也就比较速度的解决了。
第一次看提高叠加处理速度(2)中关于sheet_refreshsub这个函数的最终版本有点郁闷,没怎么倒腾清楚,但是感觉即使是最初的版本,跟最终的版本都是效果没什么差别。
或许机子性能差点的话可能就明显了。
说一下这个函数中那几个if语句的理解:
bx0 = vx0 - sht->vx0; by0 = vy0 - sht->vy0; bx1 = vx1 - sht->vx0; by1 = vy1 - sht->vy0; if (bx0 < 0) { bx0 = 0; } /* 左上角坐标调整 */ if (by0 < 0) { by0 = 0; } if (bx1 > sht->bxsize) { bx1 = sht->bxsize; } /* 右下角坐标调整 */ if (by1 > sht->bysize) { by1 = sht->bysize; } //用?:代替if语句 bx0=bx0<0?0:bx0; by0=by0<0?0:by0; bx1=bx1>sht->bxsize?sht->bxsize:bx1; by1=by1>sht->bysize?sht->bysize:by1;那四个if是原作者的,不过我喜欢用?:这样看起来简洁一些。
解释:
最初的版本是对于所有的vx 和vy判断是否处于 (vx0,vx1)~(vx1,vy1)【这四个是由参数传进来的】之间,处于之间的像素才进行重绘,
其中 vx=sht->vx0+bx(bx的范围是 0 ~ sht->bxsize)
vy=sht->vy0+by(by的范围是 0 ~ sht->bysize)
sht->vx0是当前图层所在屏幕的坐标,【同理sht->vy0】
那么我们仅仅需要重绘的范围应该是(vx0,vx1)~(vx1,vy1)中的,也就是有这样的不等式:
vx0<= sht->vx0+bx< vx1 vy0<= sht->vy0+by< vy1
按照作者的说法,为了在for语句中不进行判断,就必须将bx和by的大小分别限定在vx0-sht->vx0~vx1-sht->vx0 和vy0-sht->vy0~vy1-sht->vy0之间,这样确保在for语句中都是赋值语句,也就是上边代码前4行的赋值语句的含义,后边的4个if是为了判断不至于产生负数,说的直白一些就是处理一下边界情况(重绘区域在左上角和右下角的情况)
其实试验之后发现改不改效果没啥区别。。。。