我正在尝试使用bios视频中断在屏幕上显示一个字符。以下是汇编代码:
mov $0x0A, %AH
mov $0x68, %AL ; to display character 'h'
int $0x10我使用GNU汇编程序汇编了这段代码,生成了一个名为sample.o的目标文件,sample.o的总大小为449字节。现在,我手动将十六进制数字0x55和0xAA写入到此目标文件的511和512字节位置,以便使其可引导。所以我相信现在我有了一个512字节的引导扇区。我使用qemu尝试从这个目标文件引导:
$> qemu -fda sample.oqemu模拟器在显示“正在从软盘启动...”的位置启动并冻结。但我认为在它检测到引导扇区后,bios视频中断代码应该会运行并在屏幕上显示一个字符。
我知道我做了一件可怕的错事。也许我错过了中断的整个概念。有人能帮上忙吗。
编辑:所以我现在使用as86和ld86来生成平面二进制文件。而不是AH中的0x0A,我使用0x0E,它似乎起到了作用。看起来像是bios实现问题。
我感谢所有回复的人。
谢谢
发布于 2010-06-25 07:55:42
除了生成的二进制代码之外,一个普通的.o文件还包含相当多的内容,所以您所做的事情不起作用也就不足为奇了(结果应该大约是10个字节)。
您可以为ld编写一个脚本,让它生成一个平面二进制文件(我似乎记得这是可能的,但还没有亲自尝试过)。如果我这样做,我可能会使用nasm,因为它可以很容易地生成原始的二进制输出。另一种可能是一些旧的MS-DOS汇编程序,它可以产生.com格式的输出(这也是原始的二进制文件,尽管你必须小心,因为它的加载有点不同)。
发布于 2010-06-25 07:53:27
您需要在BL中传递属性值(07h在黑色中为灰色),在BH中传递页码,在CX中传递计数。
你说你用gas编译它,它给了你一个448字节的文件?你是在组装成ELF文件还是别的什么?我推荐nasm -f bin,使用bit16指令。
发布于 2010-06-25 08:29:29
正如曾傑瑞所说,问题是你的.o文件不是一个具有正确引导扇区的软盘镜像。除了代码之外,.o文件还包含许多信息,如符号名称和重定位信息。
如果您使用的是NASM,请使用-f bin生成原始二进制文件。如果你使用的是LD,你可以写一个链接器脚本。
对于这类事情的帮助,最好的地方可能是osdev.org和它的论坛。
https://stackoverflow.com/questions/3114653
复制相似问题