我正在我正在处理的自定义OS项目中实现put(在屏幕上打印字符串)系统调用。字符串的绝对内存地址由表示unsigned int
寄存器的esi
变量提供给我,我需要初始化指向unsigned char
数组的指针以从中读取字符串。< / p>
寄存器内容由:
表示struct regs
{
unsigned int gs, fs, es, ds;
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned int int_no, err_code;
unsigned int eip, cs, eflags, useresp, ss;
};
我已尝试以下方法初始化指向esi
中的地址的指针:
void fault_handler(struct regs *r) {
void *p = (void*)r->esi;
unsigned char* s = (unsigned char*)p;
// take s and print it to the screen
}
但我没有得到“你好\ n”我应该得到,而是我得到了垃圾。我确认esi
的地址确实指向了正确的字符串。我遇到的问题是初始化一个指向这个地址的指针。
谢谢!
更新:我将关闭此问题并将讨论移至新问题,因为原始答案已得到解答。谢谢大家!
答案 0 :(得分:0)
您的代码正确地将esi分配给p然后s。因此,我只能假设您的问题实际上与此步骤无关。
顺便说一句,我不明白为什么你需要p,只需将esi直接分配给s。
答案 1 :(得分:0)
这段代码没问题,正如@David Heffernan所说,没有使用p
。您只需直接将esi
分配给s
即可。您已检查过地址,但请检查段寄存器值(实模式)/段选择器(保护模式),确保段寄存器值正确且esi
中的地址与同一段使用时在处理程序中,以及您描述字符串的位置。可能这会有所帮助。
答案 2 :(得分:0)
正如其他人所说,您可以立即使用s
初始化r->esi
,而无需中间变量p
。但是需要强制转换,因此初始化应该看起来像unsigned char* s = (unsigned char *) r->esi;
。
然而,关于你的代码的一些事情引起了微弱的怀疑。寄存器名称看起来像x86平台上的32位寄存器的名称。你的指针也是32位吗?即你在编译代码是32位代码吗?