小编Jak*_*582的帖子

为什么我的视频内存偏移量计算会减一?

我一直在阅读并遵循Nick Blundell从零开始编写操作系统的教程,可以在https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-找到dev.pdf

我已经成功编写了一个可以调用C代码的引导加载程序,因此我开始在C中编写内核.我现在正在尝试编写可以在屏幕上打印字符和字符串的函数.当我开始执行C代码时,我处于32位保护模式,所以我试图正确计算视频内存地址0xb8000的内存偏移量.

当我尝试使用计算的偏移量访问视频内存的特定区域时,我的问题就出现了.由于文本区域是25行乘80列,我使用公式((行*80)+列)*2,因为我必须有一个字符字节和一个属性字节.当我设置row = 0和column = 0时,我正在尝试打印的X不存在.设置row = 0和column = 1,X出现在左上角.

从char*video_memory = 0xb8000开始并重复发出video_memory ++允许我正确访问每个字节并在黑色背景上打印空格.

这是我的主要代码:

#include "../drivers/screen.h"

void main() {

   //clear_screen();
   //print_character('X', 0, 0, 0);

   // Helper variables.
   int row;
   int column;

   // We need to point at 0xB8000, where video memory resides.
   unsigned char* video_memory = (unsigned char*)0xB8000;
   for(row = 0; row < 25; row++) {
      for(column = 0; column < 80; column++) {
         // Clear the screen by printing a space on a …
Run Code Online (Sandbox Code Playgroud)

c operating-system video-memory off-by-one

6
推荐指数
1
解决办法
108
查看次数

标签 统计

c ×1

off-by-one ×1

operating-system ×1

video-memory ×1