接收空字符串的函数
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 的增加。
我有以下问题:我将一个字符串传递给一个函数,但是,当它接收到该字符串时,它接收到一个空值并且什么都不做,我已经尝试了好几天都没有解决它,我我认为这是 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 的增加。