【问题标题】:bios video services interrupt callBIOS 视频服务中断呼叫
【发布时间】:2011-03-08 01:52:18
【问题描述】:

我正在尝试使用 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 实现问题。

感谢所有回复的人。

谢谢

【问题讨论】:

    标签: assembly bios qemu


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • ok.. 现在我正在使用 bin86 中的 as86 和 ld86 工具。在与 as86 组装后,如果我使用带有 -d 选项的 ld86,它会生成只有 8 个字节的平面二进制文件。所以我再次手动写入第 511 和第 512 字节,分别为 0x55 和 0xAA。 qemu 仍然卡在“从软盘启动...”
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多