接收空字符串的函数

Function receiving null string

我有以下问题:我将一个字符串传递给一个函数,但是,当它接收到该字符串时,它接收到一个空值并且什么都不做,我已经尝试了好几天都没有解决它,我我认为这是 main() 函数中的一个错误

这是我的代码:

void main(){
   clear_screen();
   print_string("Hello World!"); 
}


void print_string(const char *string){
   int offset = get_cursor();
   int i = 0;
   while (string[i] != 0) {
      if(offset >= ROWS * COLS * 2) {
         offset = scroll_line(offset);
      }
      if(string[i] == '\n') {
         offset = move_offset_to_new_line(offset);
      }else{
         print_char(string[i], offset);
         offset += 2;
      }
      i++;
   }
   set_cursor(offset);
}

我的代码中会发生什么? 注意:我正在关注此站点上的示例:https://dev.to/frosnerd/writing-my-own-boot-loader-3mld

总结评论中的讨论:

此示例中的引导加载程序代码(不在问题中,而是在链接站点中)被硬编码为通过从磁盘读取 2 个扇区来加载内核。所以这只有在内核映像大小小于 1 KB 时才有效。使用您修改后的代码,您的图像结果超过 1 KB(实际上是 8 KB)。所以您没有加载所有内容,特别是您没有加载包含字符串文字的图像部分。因此,当您访问它时,您会得到未初始化内存的内容,这些内容显然以零字节开头,相当于一个空字符串。

随着您编写更多代码并保持引导加载程序同步,您需要跟踪内核映像的大小:查看 load_kernel 之后的 mov dh, 2 并将 2 替换为适当数量的 512 字节扇区。对于一个更严肃的项目,你会想出一个更健壮的机制:例如内核映像的第一个扇区可以包含一个 header,它指定要读取多少个扇区。

大多数编译器和链接器设置会将字符串文字放入 read-only 数据部分(例如 .rodata),与代码部分(.text)分开,并将为每个部分占用第二组 4 KB 页面,以便可以相应地设置 page-granular 内存权限(读取和执行 .text,读取但不执行 .rodata)。因此,即使您的代码和数据可以容纳在 1 KB 中,将代码和数据放在不同页面上的需求也可能导致 8 KB 文件大小 (2 * 4 KB)。如果您添加 read-write 数据(例如不是 const 的全局变量),您可能会看到另外 4 KB 的增加。