好的,所以我一直在尝试在程序集/C 中制作两步引导加载程序,但我无法让 JMP 工作。起初我认为读取失败,但是,经过以下测试,我排除了这一点:
__asm__ __volatile__(
"xorw %ax, %ax;"
"movw %ax, %ds;"
"movw %ax, %es;"
"movb $0x02, %ah;"
"movb $0x01, %al;"
"movw $0x7E00, %bx;"
"movw $0x0003, %cx;"
"xorb %dh, %dh;"
"int $0x13;"
"movb 0x7E00, %al;"
"movb $0x0e, %ah;"
"int $0x10;"
//"jmp 0x7E00"
);
这按预期打印了“f”(扇区的第一个字节是 0x66,这是“f”的 ASCII 代码),证明读取成功并且jmp
是问题所在。这是我的代码:
__asm__(".code16\n");
__asm__(".code16gcc\n");
__asm__("jmpl $0x0000, $main\n");
void main(){
__asm__ __volatile__(
"xorw %ax, %ax;"
"movw %ax, %ds;"
"movw %ax, %es;"
"movb $0x02, %ah;"
"movb $0x01, %al;"
"movw $0x7E00, %bx;"
"movw $0x0003, %cx;"
"xorb %dh, %dh;"
"int $0x13;"
"jmp $0x200;"
);
}
运行时,我的程序只是挂起,这意味着程序可能跳转到内存中的错误位置。顺便说一句,我显然是在 VMWare 播放器下以实模式运行的。我正在使用以下命令编译它:
gcc -c -0s -march=i686 -ffreestanding -Wall -Werror boot.c -o boot.o
ld -static -Ttest.ld -nostdlib --nmagic -o boot.elf boot.o --no-check-sections
objcopy -0 binary boot.elf boot.bin
这是test.ld
:
ENTRY(main);
SECTIONS
{
. = 0x7C00;
.text : AT(0x7C00)
{
*(.test);
}
.sig : AT(0x7DFE)
{
SHORT(0xAA55);
}
}
注意:我已经确认这不是内联 asm 的问题——我也尝试过纯汇编实现,结果相同——我使用 C 的唯一原因是因为我打算扩展它一点,我更舒服使用 C 循环和函数...
编辑:我在这里上传了我的软盘驱动器的前三个扇区
编辑2:我无法使用任何建议让我的引导加载程序工作,并且根据@RossRidge 的建议,我编写了同一程序的汇编版本和一个简单的汇编程序来回显输入。可悲的是,这些也不起作用..
引导加载程序:
org 0x7c00
xor ax, ax
mov ds, ax
mov es, ax
mov ah, 0x02
mov al, 0x01
mov bx, 0x7E00
mov cx, 0x0003
xor dh, dh
int 0x13
jmp 0x7E00
第 3 区计划:
xor ax, ax
int 0x16
mov ah, 0xe
int 0x10
它们都用: 编译,nasm Linux/boot.S -o Linux/asm.bin
并且行为与它们的 C 对应物相同..