【问题标题】:load 2nd sector from bootloader从引导加载程序加载第二个扇区
【发布时间】:2013-08-24 15:36:54
【问题描述】:

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

我使用 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'

结果 = 根本不打印 '7' 我怎么了? 谢谢

【问题讨论】:

  • 你确定0f00h 上有一个7 吗?您的second_sector 似乎不在该地址。
  • 使用 ah 02h 和 int 13h,我想我将 second_sector 加载到 0xf00。你能告诉我更多吗?
  • mov al, [0xf00] 隐含为[ds:0xfoo]。您已明确将es 0 设为读取,但ds 是“未知”。尝试修复它。
  • 谢谢!它是固定的。
  • @FrankKotler 你真的应该把它作为一个答案,并得到它的功劳。

标签: assembly x86 bootloader fasm sector


【解决方案1】:

弗兰克·科特勒认为问题出在这条线是正确的:

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

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 2016-07-02
    • 2013-01-25
    • 2012-04-09
    • 2012-07-25
    • 2016-03-22
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    相关资源
    最近更新 更多