alloca
C语言编译器规定, 如果栈的大小超过4KB,则会调用__alloca()这个函数来获取栈的空间。为了能够使用更大的栈空间,我们需要简单地实现这个函数。
__alloca:
ADD EAX,-4
SUB ESP,EAX
JMP DWORD [ESP+EAX]
EAX是要分配的栈大小。因为call这个函数会push返回地址,导致ESP-4,所以只需要另外分配EAX-4的空间,最后JMP到返回地址。
文件操作API
文件操作包括打开,关闭,定位,读取等。在TASK结构中添加一个FILEHANDLER的数组,相当于为每个进程分配的文件打开表。FILEHANDLER结构包含文件在内存中的buffer,当前读取位置等信息。
文件的打开直接把文件在磁盘上所有内容复制到buffer中了。文件读取则是从buffer复制到传入的参数指向的地址。注意文件的buffer在系统空间,要复制到的目标地址是应用程序空间,复制时需要加上dsbase。
显示文字
如果要显示日文或者中文文字,一个字需要两个字节表示,且一个全角字由左右两个部分组成,刚好是半角字大小的两倍,两个部分需要分别绘制。
字符的显示还是用字库文件,每个全角字符由16×16bit组成。这个字库文件相对于之前的英文字库大得多。之前的字库直接在启动时读入内存了,现在改为以打开文件的方式读入。