如何用bios中断13h在硬盘上写字

时间:2012-01-29 23:14:37

标签: assembly bootloader bootstrapping bios

我想将我的引导加载程序复制到自身内部的第一个扇区(512)(我应该使用bios中断13h),我找到了这段代码:

mov bx, buffer1       ; set BX to the address (not the value) of BlahBlah 
mov ah,03h            ;When ah=, int13 reads a disk sector
mov al,5              ;Al is how many sectors to read

mov cl,0              ;Sector Id
mov dh,0              ;Head
mov dl,80h            ;Drive (0 is floppy)
mov cx,512            ;One sector /2   

mov ah, 0x3           ; set function 2h
int 0x13  

不行不通!

2 个答案:

答案 0 :(得分:9)

你的代码非常混乱。为了在int 13h中正确使用AH = 3,您还需要设置ESBX所在的细分,例如ES:BXCX的地址应该读取和写入硬盘的缓冲区),cylinder = CL[7:6] || CH到柱面和扇区号的组合(sector = CL[5:0]5000h)。

假设您要在硬盘0上将物理地址xor ax, ax mov es, ax ; ES <- 0 mov cx, 1 ; cylinder 0, sector 1 mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk) mov bx, 5000h ; segment offset of the buffer mov ax, 0301h ; AH = 03 (disk write), AL = 01 (number of sectors to write) int 13h 中的一个扇区(512字节)写入CHS 0:0:1,您的代码将如下所示:

AH

您还应该记住在执行中断后检查是否已设置进位标志。如果功能已正确执行,将会很清楚。如果已设置,则{{1}}寄存器将包含错误代码。

答案 1 :(得分:2)

BIOS功能有输入参数。如果你没有正确获得所有输入参数,BIOS功能将无法猜出你的意思。对于您正在使用的BIOS功能,请查看:http://www.ctyme.com/intr/rb-0608.htm

据我所知,你缺少CH和ES的合理值,因此BIOS可以将数据从完全不同的地址写入完全不同的扇区。另请注意,CL是CX寄存器的最低一半 - 没有必要将值加载到CL中,然后通过将某些内容加载到CX中来覆盖它。

BIOS功能也会返回值。在你的情况下,BIOS可能会返回一个状态代码,告诉你出了什么问题,并且因为你没有检查你是否知道出现了什么问题或是什么问题。