Int 13h呼叫在缓冲区之前放置数据

时间:2014-12-21 19:01:20

标签: assembly buffer bootloader

我正在开发一个小型OS引导程序。我使用int 0x13函数来读取硬盘的第一个扇区。问题是,如果我在地址0x7e00中传递它作为缓冲区,我得到的数据从0x7d71开始。

出于测试目的,硬盘驱动器为2 KB,填充字母“A”。我正在使用Qemu来测试我的bootloader。

这是我的一段代码:

mov ax, 0x7e00    ; Address to place data.
shr ax, 4         ; Shift right for es index instead of bx
mov es, ax        ; Put buffer address into es
xor bx, bx        ; Zero out bx, because it is not needed
mov ah, 0x02      ; Sub function to read disks
mov al, 0x01      ; Read 1 sector
xor ch, ch        ; At cylinder 0
mov cl, 0x01      ; At sector 1
xor dh, dh        ; At head 0
mov dl, 0x80      ; On hard drive 0
int 0x13

后来,当我碰巧读到0x7d71时:

mov al, byte [0x7d71]    ; Get the character at 0x7d71
mov ah, 0x0e             ; Sub function to teletype print al
xor bx, bx               ; On page 0
mov cx, 0x00001          ; 1 time
int 0x10

我收到了字母'A'。我可以继续在地址上升,但仍然得到'A'。

我是否在缓冲区中发送es:bx错误? bios搞砸了吗? (我使用Qemu来模拟,使用nasm进行装配,使用magiciso来生成iso)

2 个答案:

答案 0 :(得分:0)

您可以尝试不使用A填充该HD的第一个扇区,然后在第二个扇区中读取。你当前的bootprogram的长度是0x0171字节吗?我猜你的引导加载程序没有从第一个扇区加载,但是QEMU确实在0x7C00加载了A的整个扇区,然后在0x7C00只放置了0x0171个字节的程序代码

答案 1 :(得分:0)

问题解决了。我不得不手动指定缓冲区为0x7C90,数据放在0x7C00。我清理了我的代码并添加了更多东西,这解决了问题。谢谢你的帮助。