【发布时间】:2021-04-14 01:17:16
【问题描述】:
我在学校一直在做一个定制的操作系统项目,当我开始用 C++ 编码时,我遇到了一个巨大的问题:
我在汇编中构建了一个自定义的 put_char 函数,它基本上需要一个地址和一个 Dword 值并将其保存在内存中。我用的是Qemu虚拟机,0xb8000是Screen memory start (SCREEN_START)
如果我在 CPP 中运行代码:
put_char(SCREEN_START, 0x2f562f56)
(0x2f202f56 是 "/V/V") 它将“VV”打印到屏幕上,因此该功能本身确实有效。
put_chars 代码:
put_char:
push ebp ; save the prior EBP value
mov ebp, esp
mov ebx, edi;
mov edx, esi;
mov dword [ebx], edx
xor eax,eax
pop ebp ; minimal cleanup
ret
但是当我绑定从数组中打印一个字符时,就会出现问题: 当我尝试将字符串 (char *) 传递给函数时,它会发送错误的值。
void pp(char hello[])
{
for (int i = 0; i < 7; i++)
{
put_char(SCREEN_START + i*4, hello[i] );
}
}
global void kernel_main()
{
pp("Hello!");
}
屏幕每次打印不同的值,而且从来不是“你好!”... 例如它只打印空格...
根据我的阅读,当堆栈损坏时会发生这种情况,但我没有在我的任何代码中使用堆栈,尤其是汇编代码。
不太确定如何解决这个问题,尝试了不同的方法,比如构建一个结构或一个类,将其作为 char* 而不是 char[] 传递,制作一个常量字符串以在函数外部打印……没有任何效果,我什至尝试发送int数组,但没有成功。
如果有人可以提供帮助,请告诉我!真的很需要!
【问题讨论】:
-
注意:如果发送即时值,put_char 函数可以正常工作...
-
I've been working on a customized operating system project in school这在学校看起来不太明智。 -
从表面上看,您的问题可能是任何问题,从简单的参数顺序错误到
put_chatr()(第一个字符,然后是数字)到复杂的put_char()不工作。如果您没有向我们展示更多内容,并且如果您没有更详细地解释会发生什么,(“打印不同的值”是不够的)我们无法判断。 -
另外,为了将来参考,当在 stackoverflow 上提问时,只要坚持事实并跳过关于正在发生的事情的理论。你的函数接收到错误的指针是一个理论。堆栈被破坏是一个理论。这些理论都无关紧要。相关但您没有展示的是
put_char()的原型以及put_char()的实现或至少是文档。 -
我已经编辑了这个问题。看看吧。