Debugging QEMU的x86 16位程序集调试问题

Debugging QEMU的x86 16位程序集调试问题,debugging,x86,qemu,16-bit,Debugging,X86,Qemu,16 Bit,我是x86汇编的新手,但做了将近34年的程序员。我正在写一个16位操作系统,一切都在一定程度上正常工作。该程序分为引导加载程序和内核二进制文件,然后将它们合并到一个映像文件中。当通过QEMU运行程序时,引导加载程序在0x7c00精细运行和加载,并在屏幕上显示消息,成功地将内核加载到0x7e00,并成功启动清除屏幕并将光标设置在屏幕左上角的进程。然而,当它接着向屏幕显示消息时,它失败了。当objdump内核二进制文件时,我可以看到二进制文件被设置为在正确的地址将第一个字节加载到SI寄存器中,但是什

我是x86汇编的新手,但做了将近34年的程序员。我正在写一个16位操作系统,一切都在一定程度上正常工作。该程序分为引导加载程序和内核二进制文件,然后将它们合并到一个映像文件中。当通过QEMU运行程序时,引导加载程序在0x7c00精细运行和加载,并在屏幕上显示消息,成功地将内核加载到0x7e00,并成功启动清除屏幕并将光标设置在屏幕左上角的进程。然而,当它接着向屏幕显示消息时,它失败了。当objdump内核二进制文件时,我可以看到二进制文件被设置为在正确的地址将第一个字节加载到SI寄存器中,但是什么也没有发生。调整地址结果表明,地址在正确位置后偏移了230-255字节。我已经将所有段寄存器设置为零,但仍然没有任何区别。
是否有人对原因和修复有任何想法,以及是否有通过QEMU调试原始二进制文件的想法。我所看到的每个链接都只显示了如何通过GDB通过TCP端口链接到QEMU来调试ELF文件。

您能告诉我们内核的代码以及如何将内核链接到二进制文件吗?对于调试,我推荐BOCHS,因为它有一个合适的16位实模式调试器。调试16位实模式代码实际上是非常困难的,因为GDB不理解实模式段:偏移地址代码太大,无法上传,所以我已经反汇编了二进制文件,并提取出了失败的行。我不知道你把内核链接到二进制7e26是什么意思:be c5 7e mov si,0x7ec5 mov si,Heading1 Heading1 7ec5:20 62 61和BYTE PTR[bp+si+0x61],ahI已经上传了我的内核代码。正如我所说的,它一直工作到调用println,它打印一个a的负载,而不是Heading1内存位置中的文本,在反汇编代码上显示其地址为7ec2。嗨,Michael只是想说我做了更改,它确实解决了问题。非常感谢你能给我们展示你的内核的代码,以及你如何将内核链接到二进制文件吗?对于调试,我推荐BOCHS,因为它有一个合适的16位实模式调试器。调试16位实模式代码实际上是非常困难的,因为GDB不理解实模式段:偏移地址代码太大,无法上传,所以我已经反汇编了二进制文件,并提取出了失败的行。我不知道你把内核链接到二进制7e26是什么意思:be c5 7e mov si,0x7ec5 mov si,Heading1 Heading1 7ec5:20 62 61和BYTE PTR[bp+si+0x61],ahI已经上传了我的内核代码。正如我所说的,它一直工作到调用println,它打印一个a的负载,而不是Heading1内存位置中的文本,在反汇编代码上显示其地址为7ec2。嗨,Michael只是想说我做了更改,它确实解决了问题。非常感谢