我写了一个小bootloader来学习,它会打印出bootloader第一条指令的内存地址,肯定是0x7c00。请参阅下面的汇编源代码运行良好。
boot.s
.code16
.global init
init:
mov $0x07c0, %ax
mov %ax, %ds
mov $0x07e0, %ax
mov %ax, %ss
mov $0x2000, %sp
call next
next:
pop %bx
sub $(next-init), %bx # starting point of memory address, now stored in %bx
call print_register
jmp .
print_register: # always print out value in %bx
mov %bh, %cl
shr $0x4, %cl
and $0x0f, %cl
call print_digit
mov %bh, %cl
and $0x0f, %cl
call print_digit
mov %bl, %cl
shr $0x4, %cl
and $0x0f, %cl
call print_digit
mov %bl, %cl
and $0x0f, %cl
call print_digit
ret
print_digit: # %cl has digit to be printed
cmp $0x9, %cl
jg print_digit_atof
print_digit_1to9:
add $0x30, %cl
jmp print_digit_out
print_digit_atof:
add $0x57, %cl
print_digit_out:
mov %cl, %al
mov $0x0e, %ah
int $0x10
ret
.=510
.byte 0x55
.byte 0xaa
as -o boot.o boot.s
ld -o boot.bin --oformat binary -e init boot.o
在VMWare Player中,创建一个虚拟机,并设置boot.bin
为软盘的内容,然后开机。我可以看到7c00
打印在屏幕上。
到目前为止,一切都很好。
请参阅此答案Creating a bootable ISO image with custom bootloader,但现在如果我boot.bin
通过以下命令将作为引导加载程序放入 iso 映像:
dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc
mkdir iso
cp floppy.img iso/
genisoimage -quiet -V 'MYOS' -input-charset iso8859-1 -o myos.iso -b floppy.img \
-hide floppy.img iso/
并启动虚拟机myos.iso
,屏幕上显示0000
。
为什么不是7c00
?
阅读答案后更新,当我打印出 %cs 时,我可以看到:
1. boot from floppy disk, start address is 0x0000:7c00
2. boot from cd rom, start address is 0x07c0:0000