[英]How to write on hard disk with bios interrupt 13h
我想将引导加载程序复制到自身内部硬盘的第一个扇区(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
埠它不起作用!
您的代码非常混乱。 为了正确使用AH = 3
int 13h
,还需要设置ES
( BX
所在的段,例如ES:BX
是应读写到硬盘的缓冲区的地址)和CX
到柱面和扇区号的组合( cylinder = CL[7:6] || CH
, sector = CL[5:0]
)。
假设您要从物理地址5000h
向硬盘0上的CHS 0:0:1写入一个扇区(512字节),您的代码将如下所示:
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
您还应该记得执行中断后检查是否已设置了进位标志。 很明显,该功能是否已正确执行。 如果已设置,则AH
寄存器将包含错误代码。
BIOS函数具有输入参数。 如果您没有正确输入所有输入参数,则BIOS函数将无法猜测您的意思。 有关您使用的BIOS功能的信息,请访问: http : //www.ctyme.com/intr/rb-0608.htm
据我所知,您缺少CH和ES的合理值,因此BIOS可以将数据从完全不同的地址写入完全不同的扇区。 还要注意,CL是CX寄存器的最低部分-将值加载到CL然后通过将某些内容加载到CX来覆盖它是没有意义的。
BIOS函数也返回值。 在您的情况下,BIOS可能会返回状态代码,告诉您出了什么问题,并且由于您不进行检查,所以您不知道是否出了什么问题或出了什么问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.