是鼠标移动的思路:调整坐标重新显示
当CPU进行模式转换和PIC进行初始化的时候,都不允许有中断发生,因此要将中断屏蔽掉。
汇编指令NOP只是让CPU休息一个时钟长的时间。
这条汇编语句:
MOV AL,0xdf
是要让A20GATE信号线变成ON的状态,这条信号线能让内存1MB以上的部分变成可使用状态。最初出现电脑的时候,CPU只有16位模式,所以内存最大也只有1MB。后来CPU可以使用更大的内存了,但为了兼容旧的操作系统,在执行激活指令之前,电路被限制为只能使用1MB的内存。
INSTRSET指令,是为了能够使用386以后的LGDT、EAX、CR0等关键字。
LGDT指令,不管三七二十一,把随意准备的GDT给读进来。对于这个暂定的GDT,我们以后还需要重新设置。然后将CR0这一特殊的32位寄存器的值代入了EAX,并将最高位置置为0,最低位置置为1。再将这个值返回给CR0寄存器。这样就完成了模式转换,进入到不用分页的保护模式。
“虚拟内存地址” 与 “实际地址” 的区别在于计算内存地址时,是使用段寄存器的值直接指定地址值的一部分呢,还是通过GDT使用段寄存器的值指定并非实际存在的地址号码。
在这种模式下,应用程序既不能随便改变段的设定,又不能使用操作系统专用的段。操作系统受到CPU的保护,所以称为保护模式。
变成保护模式,机器语言的解释要发生变化。CPU为了加快指令的执行速度而使用了管道这一机制,也就是说,前一条指令还在执行的时候,就开始解释下一条指令甚至是再下一条指令。因为模式变了,就要重新解释一遍,所以加入了JMP指令。
函数memcpy是复制内存的函数,语法如下:
memcpy(转送源地址, 转送目的地址, 转送数据的大小);
传送数据大小是以双字为单位的,所以数据大小用字节数除以4来指定
举个例子:
memcpy(0x7c00, DSKCAC, 512/4);
DSKCAC是0x00100000,所以上面这句话的意思是从0x7c00赋值512字节到0x00100000。
SHR指令是向右移位指令,与除以4有相同的效果.、
JZ是条件跳转指令,根据前一个计算结果是否为0来决定是否跳转。而JNZ则正好相反。