在 QEMU 中诊断引导加载程序代码?
我正在尝试创建一个最小的“引导加载程序代码”,打印字符“A”然后停止。
为此,我编写了以下 C++ 程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
/*
* If I run these code directly in Windows, it crashes, for I believe Windows
* do not allow accessing the BIOS directly, that make sense
*
* But I can compile a binary, then I can use the debugger to view what machine code
* does these correspond to, and build to boot program!
*/
/*
__asm
{
mov ah, 0x0e
mov al, 0x41
mov bx, 15
int 0x10
hlt
lp: jmp lp
}
*/
int disk_length = 80 * 18 * 512 * 2;
char* disk = (char*)calloc(disk_length, sizeof(char));
const char program[] =
{
0xb4, 0x0e, // mov ah, 0EH
0xb0, 0x41, // mov al, 41H
0x66, 0xbb, 0x0f, 0x00, // mov bx, 0FH
0xcd, 0x10, // int 10H
0xf4, // hlt
0xeb, 0xfe // lp: jmp lp
};
const char boot_signature[] = {0x55, 0xAA};
const int program_length = _countof(program);
const int boot_signature_length = _countof(boot_signature);
// Be careful with file mode
FILE* imgFile = fopen("disk.img", "wb");
memcpy(disk, program, program_length);
memcpy(disk + 510, boot_signature, boot_signature_length);
int written = 0;
while (written < disk_length)
{
written += fwrite(disk + written, sizeof(char), disk_length - written, imgFile);
}
fclose(imgFile);
return 0;
}
首先,我在未注释内联程序集的情况下运行代码。在调试器中,我派生了操作码,并确定操作码与我的源代码中的操作码匹配。接下来,我运行带有注释的内联程序集的代码,然后生成了一个 img 文件。我使用二进制编辑器查看内容并确保它看起来像我想要的那样。最后,我运行了 qemu-system-i386.exe -fda disk.img,我希望引导加载程序显示一个大写的“A”,但实际上什么也没显示。
现在我有两个问题:
1.) 我的代码有什么问题?2.) 我该如何诊断?