Assembly 从引导加载程序加载第二个扇区
我正在尝试加载软盘的第二扇区 我用fasm 1.7和Windows7、VMware测试了这段代码。 为了制作软盘图像文件,我使用了Ubuntu 13.04中的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
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你真的应该把它作为一个答案,并为此获得荣誉。