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

Assembly 从引导加载程序加载第二个扇区,assembly,x86,bootloader,fasm,sector,Assembly,X86,Bootloader,Fasm,Sector,我正在尝试加载软盘的第二扇区 我用fasm 1.7和Windows7、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

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

我用fasm 1.7和Windows7、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'
结果=根本不打印“7” 我怎么了?
谢谢

弗兰克·科特勒的评估是正确的,他认为问题在于线路:

mov al, [0xf00];
在没有设置段的情况下,[0xf00]隐式地为[ds:0xf00]。在这个回答中,我给出了一些。提示1:

当BIOS跳转到您的代码时,您不能依赖CS、DS、ES、SS、SP 具有有效值或期望值的寄存器。它们应该建立起来 当引导加载程序启动时,请选择适当的方式。你只能得到保证 您的引导加载程序将从物理地址加载并运行 0x00007c00,并且引导驱动器号已加载到DL中 登记

您确实将ES设置为0:

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

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设置为不受干扰的位置。读取活动堆栈顶部的磁盘数据将导致失败。请参阅前面提到的Stackoveflow答案的链接以获取示例。

Frank Kotler的评估是正确的,即问题在于线路:

mov al, [0xf00];
在没有设置段的情况下,[0xf00]隐式地为[ds:0xf00]。在这个回答中,我给出了一些。提示1:

当BIOS跳转到您的代码时,您不能依赖CS、DS、ES、SS、SP 具有有效值或期望值的寄存器。它们应该建立起来 当引导加载程序启动时,请选择适当的方式。你只能得到保证 您的引导加载程序将从物理地址加载并运行 0x00007c00,并且引导驱动器号已加载到DL中 登记

您确实将ES设置为0:

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

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设置为不受干扰的位置。读取活动堆栈顶部的磁盘数据将导致失败。请参阅前面提到的Stackoveflow答案的链接以获取示例。

您确定
0f00h
处有
7
?您的
第二个\u扇区
似乎不在该地址。使用ah 02h和int 13h,我想我会将第二个\u扇区加载到0xf00。你能再告诉我一点吗?
mov al,[0xf00]
是隐式的
[ds:0xfoo]
。您已为读取显式设置了
es
0,但
ds
为“未知”。试着修一下,谢谢!它是固定的。@FrankKotler你真的应该把它作为一个答案,并为此获得积分。你确定在
0f00h
7
?您的
第二个\u扇区
似乎不在该地址。使用ah 02h和int 13h,我想我会将第二个\u扇区加载到0xf00。你能再告诉我一点吗?
mov al,[0xf00]
是隐式的
[ds:0xfoo]
。您已为读取显式设置了
es
0,但
ds
为“未知”。试着修一下,谢谢!这是固定的。@FrankKotler你真的应该把它作为一个答案,并为此获得荣誉。