操作系统-操作系统-内核中的屏幕打印(下)
接着之前的实现顺序来,对PrintString进行实现

int PrintString(const char* s)//需f要对参数进行判断,如果参数为空,返回-1
{
int ret = 0;

if( s != NULL )
{
    while( *s )
    {
        ret += PrintChar(*s++);//不为空时进行循环,直到遇见结束符结束
    }
}
else
{
    ret = -1;
}

return ret;

}

//在这里需要单独对NULL进行定义 kernel.h

#ifndef KERNEL_H
#define KERNEL_H

#define NULL ((void*)0)

#endif
屏幕清空的操作如下

void ClearScreen()//二重循环对屏幕每一个位置打印空字符
{
int h = 0;
int w = 0;

SetPrintPos(0, 0);

for(h=0; h<SCREEN_HEIGHT; h++)
{
    for(w=0; w<SCREEN_WIDTH; w++)
    {
        PrintChar(' ');
    }
}

SetPrintPos(0, 0);

}
PrintIntHex()的实现

int PrintIntHex(unsigned int n)
{
char hex[11] = {'0', 'x', 0};//将整数进行转换
int i = 0;

for(i=9; i>=2; i--)
{
    int p = n & 0xF;//位与判断

    if( p < 10 )
    {
        hex[i] = ('0' + p);//将0-9数字转换为字符
    }
    else
    {
        hex[i] = ('A' + p - 10);//当低四位大于10,A B C
    }

    n = n >> 4;//将N右移四位
}

return PrintString(hex);//16进制的字符串打印

}
在之前实现了其中的函数接口,接下来对剩下的函数接口进行实现
int PrintIntDec(int c)--递归推导
代码实现-十进制

int PrintIntDec(int n)
{
int ret = 0;

if( n < 0 )
{
    ret += PrintChar('-');//多打印一个字符

    n = -n;

    ret += PrintIntDec(n);
}
else
{
    if( n < 10 )
    {
        ret += PrintChar('0' + n);
    }
    else
    {
        ret += PrintIntDec(n/10);
        ret += PrintIntDec(n%10);
    }
} 

return ret;

}
操作系统-操作系统-内核中的屏幕打印(下)
在保护模式下的光标跟踪-两个不同指定端口的操作
操作系统-操作系统-内核中的屏幕打印(下)
上图所示的是高八位与低八位的光标设置,代码实现已经在int SetPrintPos(short w, short h)函数中进行实现,将光标设置高8位与低8位的汇编代码内嵌到C语言代码中

实验与结果-符合预期的结果
操作系统-操作系统-内核中的屏幕打印(下)操作系统-操作系统-内核中的屏幕打印(下)
与该实验相关的代码在该地址进行保存,需要可以进行下载http://www.fm2.2445544.com/13465106/up

小结
1.GCC编译器只支持AT&T格式的内嵌汇编
2.通过汇编的方式可实现PrintCha()函数
3.PrintCha()是其它屏幕打印函数的基础
4.通过操作0x03D4与0x03D5端口对光标位置进行设置