2013-08-22 48 views
0

我想加载第二扇区的软盘从引导程序加载第二扇区

我用fasm 1.7和windows 7测试此代码,VMware。 使软盘映像文件,我用dd从Ubuntu的13.04 我也用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' 

结果=完全不 什么是打印“7”我错了吗? 感谢

+0

你确定'0f00h'处有'7'吗?您的'second_sector'似乎不在该地址。 – lurker

+0

使用啊02h和int 13h,我想我把second_sector加载到0xf00。你能告诉我更多一点吗? –

+4

'mov al,[0xf00]'隐含地是'[ds:0xfoo]'。您已经明确地为读取设置了“es”0,但是“ds”是“未知的”。尝试修复。 –

回答

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(栈)在启动时。手动设置堆栈是一种很好的做法。有关示例,请参阅前面提到的Stackoveflow答案的链接。