我想将我的引导加载程序复制到自身内部的第一个扇区(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
不行不通!
答案 0 :(得分:9)
你的代码非常混乱。为了在int 13h
中正确使用AH = 3
,您还需要设置ES
(BX
所在的细分,例如ES:BX
是CX
的地址应该读取和写入硬盘的缓冲区),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可能会返回一个状态代码,告诉你出了什么问题,并且因为你没有检查你是否知道出现了什么问题或是什么问题。