从引导加载程序加载第二个扇区

时间:2013-08-22 03:56:03

标签: assembly x86 bootloader fasm sector

我正在尝试加载第二扇区的软盘

我使用fasm 1.7和Windows 7,VMware测试此代码。 为了制作软盘映像文件,我使用了Ubuntu 13.04中的dd 我还使用dd.bin写入.img

这是我的代码

org 0x7c00

;load 2nd sector to physical ram address 0xf00
;(load '7' to 0xf00)
mov ah, 02h
mov al, 1
mov ch, 0
mov cl, 2;1~63
mov dh, 0
mov dl, 0
mov bx, 0xf00
push 0
pop es
int 13h

;check whether it is loaded correctly
;by printing a ascii character in 0xf00
mov ah,0fh
int 10h
mov ah,0ah
mov al, [0xf00];
mov cx, 1
int 10h

;pause
jmp $

times 510-($-$$) db 0h
dw 0xaa55

second_sector:
db '7'

result =根本不打印'7' 我怎么了? 感谢

1 个答案:

答案 0 :(得分:0)

弗兰克科特勒的评估是正确的,问题在于:

mov al, [0xf00];

如果没有设置段, [0xf00] 隐含 [ds:0xf00] 。在这个StackOverflow答案中,我给出了一些general bootloader development tips。提示#1:

  

当BIOS跳转到您的代码时,您不能依赖CS,DS,ES,SS,SP   具有有效或预期值的寄存器。他们应该成立   适当的引导程序启动时。你只能得到保证   您的引导加载程序将从物理地址加载和运行   0x00007c00并且启动驱动器号已加载到DL中   注册

您将 ES 设置为0:

push 0
pop es

您可以选择在内存操作数上显式设置段寄存器,如下所示:

mov al, [es:0xf00]

或者在启动时将 DS 设置为0。删除这些:

push 0
pop es

并将其添加到代码顶部:

xor ax, ax    ; Zero out ax
mov es, ax
mov ds, ax

您应该假设 SS:SP (堆栈)的位置与您读取磁盘扇区的内存冲突,因此将 SS:SP 设置为a是一个好习惯。不会受到干扰的地点。读取活动堆栈顶部的磁盘数据将导致故障。请参阅前面提到的我的Stackoveflow答案的链接。