操作系统-操作系统-内核中的屏幕打印(下)

操作系统-操作系统-内核中的屏幕打印(下)

接着之前的实现顺序来,对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语言代码中

实验与结果-符合预期的结果

操作系统-操作系统-内核中的屏幕打印(下)操作系统-操作系统-内核中的屏幕打印(下)
与该实验相关的代码在该地址进行保存,需要可以进行下载https://down.51cto.com/13465106/up

小结

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

猜你喜欢

转载自blog.51cto.com/13475106/2551651