我正在尝试使用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实施问题。
我感谢所有回复的人。
由于
答案 0 :(得分:3)
正常.o
文件除了产生的二进制代码之外还包含很多其他内容,所以你所做的事情不起作用也就不足为奇了(这个结果应该大约10个字节左右)
你可以为ld写一个脚本来让它产生一个平面二进制文件(我好像记得那应该是可能的,但是没有亲自试过)。如果我这样做,我可能会使用nasm,因为它可以很容易地生成原始二进制输出。另一种可能是一些旧的MS-DOS汇编程序,而不是产生.com
格式输出(也是原始二进制文件,但你必须小心,因为它的加载方式有点不同)。
答案 1 :(得分:0)
你需要传递BL中的属性值(07h灰色为黑色),页面编号为BH,并计入CX。
你说你用气体编译它,它给你一个448字节的文件?你在组装成ELF文件还是什么?我建议使用BITS 16指令使用nasm -f bin。
答案 2 :(得分:0)
正如Jerry Coffin所说,问题是您的.o
文件不是具有正确引导扇区的软盘映像。除了代码之外,.o
文件还包含许多信息,例如符号名称和重定位信息。
如果您使用的是NASM,请使用-f bin
生成原始二进制文件。如果您使用的是LD,则可以编写链接描述文件。
对于这类东西的帮助,最好的地方可能是osdev.org及其论坛。