操作系统实验–30天自制操作系统第4天实验日志

  • Post author:
  • Post category:其他




一、实验主要内容

1、内容1:用C语言实现内存写入

如果想要在画面上显示东西的话,那么只需要向显存中写入适当的值(代表每个像素的颜色)即可。但是C语言没有直接写入指定内存地址的语句,便需要采用汇编语言创建一个有这种功能的函数。

修改naskfunc.nas,向其添加以下部分代码:

在这里插入图片描述

这个函数类似于C语言中的write_mem8(0x1234,0x56),其中addr是内存地址,data是数据,在这里指的是颜色的色号。

在C语言中如果用到了write_mem8函数,就会跳转到_ write_mem8。此时参数指定的数字就存放在内存里,分别是;

第一个数字的存放地址 [ESP+4]

第二个数字的存放地址 [ESP+8]

第三个数字的存放地址 [ESP+12]



在指定内存地址的地方,需要使用32位寄存器。除此以外,还需要给naskfunc.nas增加一行INSTRSET指令,作用是告知nask“这个程序是给486使用的”,这样如果使用EAX,会解释成寄存器名。如果不指定的话,就会将其解释成标签。

修改C语言,添加循环函数,使其填充0xa0000-0xaffff的内存(显存地址为0xa0000-0xaffff)。

在这里插入图片描述

在这里插入图片描述

这样的话,内存中能够全部写入了15,也就是全部像素的颜色都是第15种色号的颜色,而第15种颜色是白色,因此画面变成了白色。

实验结果如上图

2、内容2:显示条纹图案

修改C语言中能够for循环的内容:

在这里插入图片描述

I&0x0f是实现条纹图案的关键内容,其将0xa0000-0xaffff与上0x0f,使得高位全部为0,低位保留。因此,写入的值为:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 …

这样使得每隔16个像素,色号就会反复一次,同时加上显示屏幕的像素为320*200,所以这就会使得显示的结果为条纹图案。

实验结果如下图

在这里插入图片描述

3、内容3:使用指针代替汇编函数

使用指针函数来替换write_mem8函数。

修改内容为:

在这里插入图片描述

其用char

声明了一个变量P,并将地址编号赋给P,再将色号填入到内存地址中。

此时C编译器会认为P是地址专用变量,而且是用于存放字符(char)的,所以就是BYTE。

Char p;用于BYTE类地址

Short p;用于WORD类地址

Int p;用于DWORD类地址

在这里,因为P是记录地址的变量,因此其都是4字节的。在汇编语言中,地址



版权声明:本文为qq_49327751原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。