【发布时间】:2016-10-28 17:32:26
【问题描述】:
我正在学习 x86 实模式编程,并使用 QEMU 编写了一个小型引导加载程序来测试它。我选择了 GNU 汇编器来学习。
这是汇编代码:
#
# boot.s
#
.section .text
.globl start
start:
//setup stack
mov $0x7c0, %ax
mov %ax, %ss
mov $512, %sp
//setup video
mov $0x0, %eax
mov $0x0, %al
int $0x10
//print a character say 'm'
mov $'m', %al
mov $0x0E, %ah
int $0x10
1:
jmp 1b
QEMU 显示屏上显示以下文本:
从硬盘启动...
问题:上面的消息被打印出来了,但它仍然是那样,似乎什么也没做。
我用来组装的脚本,链接是:
> to assemble : gcc -c boot.s
> to link : ld -T link.ld boot.o -o b.bin
> to put on bootsector of Hard-disk image
dd if=b.bin of=HD.img conv=notrunc
> to attach boot magic
echo -ne "\x55\xaa" | dd seek=510 bs=1 of=HD.img
> to emulate: qemu-system-i386 HD.img
从我在某处看到的在线教程复制的链接器脚本,因为我自己不知道如何创建一个:
OUTPUT_FORMAT("binary")
ENTRY(start)
phys = 0x00100000;
SECTIONS
{
.text phys : AT(phys) {
code = .;
*(.text)
*(.rodata)
. = ALIGN(4096);
}
.data : AT(phys + (data - code))
{
data = .;
*(.data)
. = ALIGN(4096);
}
.bss : AT(phys + (bss - code))
{
bss = .;
*(.bss)
. = ALIGN(4096);
}
end = .;
}
我需要指定任何额外的参数还是代码中有错误?我认为这是堆栈的设置,但尝试了很多可能性,但没有奏效。
如何跳过硬盘引导消息并让我的引导加载程序在屏幕上显示字母 m?
我的工作平台是 Fedora 23。
【问题讨论】:
-
“不工作”是什么意思?这不是一个有意义的问题描述。
标签: assembly x86 qemu bootloader bios