【问题标题】:barebones c char pointer [closed]准系统c char指针[关闭]
【发布时间】:2022-01-02 20:17:19
【问题描述】:

所以我一直在尝试深入研究 os 开发,并达到了可以执行 c(使用 gcc)的地步。

char* parameter = "test"
videoMemory[1] = *parameter;
videoMemory[2] = 0xcf;

当我执行代码时,除了红色背景(0xcf 指前景色和背景色)外,我什么也没有打印出来。我也试过了

videoMemory[1] = parameter[0];

什么也没得到。 执行时

videoMemory[1] = 'X';

videoMemory[1] = "test"[0];

我打印出 X 字符。 我该怎么做才能将存储在变量“参数”中的字符串打印到屏幕上

*编辑:链接到项目 [https://drive.google.com/file/d/1D1xgfbL1uY7zY48Nm-x6QNvZOhh713n1/view?usp=sharing]

已解决 我已经解决了这个问题。我用char stringarray[] = "",效果和预期一样

【问题讨论】:

  • 此处信息不足,无法提供帮助。特别是考虑到这段代码背后有一个完整的自定义操作系统,更不用说这是一个脱离上下文的不完整代码 sn-p。
  • 我已经按照本教程 [cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf],但除此之外,我的代码基本上是 main 函数中的 sn-p,仅此而已。
  • 期望人们阅读 77 页的文档来了解您所做的工作是不合理的。您需要尝试在问题本身中提供minimal reproducible example
  • videoMemory[1] = "test"[0]; 打印一个X? videoMemory 有什么类型?是uint16_t,所以它包含一个ASCII字符一个属性字节?如果是uint8_t,那么videoMemory[1] 是第二个字节,包含第一个字节的属性。 (假设您处于 VGA 文本模式。)
  • 如果(本地?)char stringarray[] = "" 与读取指向字符串文字的指针不同,则可能您的内核的 .rodata 部分不在它应该在的位置。本地数组将在堆栈上构建,如果它小于编译器的决策启发式,通常会带有一些 mov-immediate。在这种情况下,它不引用任何静态数据,只引用代码和堆栈。

标签: c assembly operating-system


【解决方案1】:

您想为内存中的地址分配一个单独的字符,就像您对 X 所做的那样,但您需要在正确的位置执行此操作。

videoMemory[0] = 'X';videoMemory[1] 是您放置角色颜色数据的位置(如果有) 如果要添加第二个字符,可以在索引 2 处添加,例如 videoMemory[2] = 'Y';

要将整个字符串打印到视频内存中,您需要编写一个函数或一组函数,它跟踪屏幕上光标的位置,遍历字符串中的每个字符打印到该位置每次前进时光标的位置。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2021-04-03
    • 2021-01-26
    相关资源
    最近更新 更多