一、实验主要内容
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字节的。在汇编语言中,地址