我正在开发一个小型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)
答案 0 :(得分:0)
您可以尝试不使用A填充该HD的第一个扇区,然后在第二个扇区中读取。你当前的bootprogram的长度是0x0171字节吗?我猜你的引导加载程序没有从第一个扇区加载,但是QEMU确实在0x7C00加载了A的整个扇区,然后在0x7C00只放置了0x0171个字节的程序代码
答案 1 :(得分:0)
问题解决了。我不得不手动指定缓冲区为0x7C90,数据放在0x7C00。我清理了我的代码并添加了更多东西,这解决了问题。谢谢你的帮助。