我正在尝试加载第二扇区的软盘
我使用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' 我怎么了? 感谢
答案 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答案的链接。