0

我正在尝试使用 bios 视频中断在屏幕上显示一个字符。以下是汇编代码:

mov $0x0A, %AH
mov $0x68, %AL ; to display character 'h'
int $0x10

我使用 GNU 汇编器组装了这段代码以生成一个名为 sample.o 的目标文件 sample.o 的总大小为 449 字节。现在,我在第 511 和第 512 字节位置手动将十六进制数字 0x55 和 0xAA 写入此目标文件,以使其可启动。所以我相信现在我有一个 512 字节的引导扇区。我使用 qemu 尝试从这个目标文件启动:

$> qemu -fda sample.o

qemu 模拟器启动并冻结在它说“从软盘启动......”但我认为在它检测到引导扇区后,应该运行 bios 视频中断代码并在屏幕上显示一个字符。

我知道我做错了可怕的事情。也许我错过了中断的整个概念。任何人都可以帮忙。

编辑:所以我现在使用 as86 和 ld86 来生成平面二进制文件。而不是 AH 中的 0x0A,我使用的是 0x0E,它似乎成功了。好像是bios实现问题。

我感谢所有回复的人。

谢谢

4

3 回答 3

3

一个普通.o文件包含的不仅仅是生成的二进制代码,所以你正在做的事情不起作用也就不足为奇了(结果应该是大约 10 个字节左右)。

您可以为 ld 编写一个脚本以使其生成一个平面二进制文件(我似乎记得这应该是可能的,但没有亲自尝试过)。如果我这样做,我可能会改用 nasm,因为它可以很容易地生成原始二进制输出。另一种可能性是一些旧的 MS-DOS 汇编程序不能产生.com格式输出(这也是原始二进制文件,尽管你必须小心,因为它的加载方式有点不同)。

于 2010-06-24T23:55:41.533 回答
0

您需要传递 BL 中的属性值(07h 为黑底灰),BH 中的页码和 CX 中的计数。

你说你用gas编译它,它给你一个448字节的文件?你是组装成一个ELF文件还是什么?我推荐 nasm -f bin,使用 BITS 16 指令。

于 2010-06-24T23:53:26.663 回答
0

正如 Jerry Coffin 所说,问题在于您的.o文件不是具有正确引导扇区的软盘映像。该.o文件除了包含符号名称和重定位信息等代码外,还包含很多信息。

如果您使用的是 NASM,请使用它-f bin来生成原始二进制文件。如果您使用 LD,则可以编写链接描述文件。

对于这类东西的帮助,最好的地方可能是osdev.org及其论坛。

于 2010-06-25T00:29:29.203 回答