如何正确地将文本插入内核的显存?

How to properly insert text into a kernel's video memory?

我知道这个标题很奇怪(我不知道如何解释它:|)但请耐心等待。

我正在 assemblyC 中制作 OS。我做了一个内核,有文本输入和输出。

我在打印或添加 space 栏事件时遇到问题;如果我打印 ' ' (space char) 它只会覆盖下一个字符(就像我们在文本编辑器中按下插入键,如果我们将光标移到字符后面 a|bc 并键入一个字符 ex.b 使其变为 b|bc ).
我希望它在字符之间插入字符并像往常一样向前移动字符 abbc 。我如何在 32 位保护模式下在 C 中执行此操作?

屏幕打印方式

    location = video_memory + (cursor_y*80 + cursor_x); //video memory is the start of the buffer 
    *location = c | attribute; //location is the calculated location to put the char in the buffer and c is the char 
    cursor_x++;

这会覆盖下一个字符

我不确定你是如何实现它的,但我确定你在内存中的某个地方有一个字符串缓冲区。你需要做的是将缓冲区 end 开始的字符向前移动一个,然后你继续 backwards, 直到你到达光标的位置。在这里,您添加新字符并增加光标的位置。

再说一遍,代码和资料都不够,我只能给你一些帮助。这是一个小示范。

  1. a|bc 用户按下 b 键。
  2. a|bc缓冲区的内存大小增加一个,空终止符先向前移动。
  3. a|b c 后跟 c.
  4. a| bc 然后 b.
  5. ab|bc现在新字符被放入缓冲区,光标增加一个。

希望对您有所帮助。

更新:

给出的代码还是少了一点;所以我假设:

  • location 的索引 returns a short.
  • cattribute 都是 short 的大小,虽然我更喜欢 chars 来保存 space.
  • cursor_ycursor_x 都是 char.
  • 内核已经可以左右移动光标了。

putchar函数:

short *location = video_memory + (cursor_y*80 + cursor_x);

// If the upper part of the VGA entry isn't zero, then don't write over it!
if (*location & 0xFF00) {
    short *temp = video_memory;
    while (*temp & 0xFF00) temp += 1; // I'm not a fan of -- and ++ operators... Feel free to change them.
    while ((temp+1) != location) {
        *(temp+1) = *temp;
        temp -= 1; // I'm not a fan of -- and ++ operators... Feel free to change them.
    }

*location = c | attribute; // I'm informed that c and attributes are both shorts; although I'd prefer chars.
cursor_x++;

注意:这是一个非常粗糙且未经测试的测试示例,说明它是如何工作的.它可能无法解决您所有的问题,但它确实为您提供了一个基本示例。