1

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

我用 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'我怎么了?谢谢

4

1 回答 1

1

弗兰克·科特勒(Frank Kotler)的评估是正确的,即问题出在以下行:

mov al, [0xf00];

在没有设置段的情况下,[0xf00]是隐含的[ds:0xf00]。在这个 StackOverflow 答案中,我给出了一些通用的引导加载程序开发技巧。提示#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设置为不会受到干扰的位置。在活动堆栈顶部读取磁盘数据将导致失败。有关示例,请参阅前面提到的我的 Stackoveflow 答案的链接。

于 2015-11-17T17:53:59.517 回答