我有一个引导扇区,用于从软盘映像加载一个名为 BOOT.BIN 的文件。但是我不知道如何从文件中读取多个扇区。FAT 12 位于 0x10000。BOOT.BIN 文件将放在 0x40000。编码:
foundfile:
mov word ax,[es:di+0x0f]
push ax ;save file cluster
;now to parse the fat
mov dx,second_boot_segment
mov es,dx
xor bx,bx
read_file_sector:
pop ax ;retrieve file cluster
mov byte dl,[drive_num]
mov cx,ax
add cx,31
push ax ;save cluster number
mov al,1
call readdisk
pop ax ;retrieve cluster number
find_clusters:
push es
push bx
mov cx,fat_segment
mov es,cx
xor bx,bx
xor dx,dx
mov cx,3
mul cx
shr ax,1
;ax is now (clusternum*3)/2
test ax,1
jz short evennum
oddnum:
shr ax,4
jmp short find_clusters_continued
evennum:
and ax,0x0fff
find_clusters_continued:
cmp ax,0x0ff0
jae short finishedread ;read all of file
mov word ax,[es:bx]
pop bx
pop es
push ax
add bx,512 ;next sector
jmp short read_file_sector
finishedread:
jmp second_boot_segment:0000
jmp fatalerror
==================================================== =======================readdisk等功能:
readdisk: ;input: es:bx for where disk data is stored, al for sectors, cx for lba, drive_num for drive output: carry flag on error, ah is return type, al is the number of sectors read
push dx ;save dx
call lbatochs
mov byte dl,[drive_num]
mov ah,2
int 13h
jc short resetdisk
mov byte dl,[drive_num]
pop dx ;restore dx
ret
resetdisk:
push ax
mov ah,0
int 13h
jc short fatalerror
pop ax
jmp short readdisk
fatalerror:
mov ax,0x0003 ;ah = 0 al = 3
int 10h
mov si,boot_error
mov ax,0xb800
mov es,ax
xor bx,bx
cld
printloop:
lodsb
or al,al ;is the last character read
jz short infloop
mov ah,0x0f ;color
mov word [es:bx],ax ;write to vram
add bl,2 ;as long a the text is less than 256 bytes this works
jmp short printloop
lbatochs: ;input: cx for lba, output: cx for cylinder and sector, and dh for head
push ax ;save for later
push bx ;save bx
;find temp variable
xor dx,dx
mov ax,cx ;ax now has lba
push ax ;save lba
mov word bx,[sects_per_track] ;sectors per track
div bx ;ax is now temp
;cylinder
push ax ;save temp
xor dx,dx
mov word bx,[num_heads] ;number of heads
div bx ;ax is now cylinder
mov cx,ax ;cx stores cylinder
pop ax ;retrieve temp
;cx is now cylinder
;head
push dx ;heads already in dx
;sector
pop dx ;pop dx to get stack value underneath it
pop ax ;retrieve lba
push dx ;push dx back on
push cx ;save cylinder
xor dx,dx
mov word bx,[sects_per_track]
div bx
inc dx ;dx now has sectors
mov bx,dx ;now bx has sectors
pop cx
pop dx
;put params together
mov ch,cl ;cylinder in ch
mov cl,bl ;sector in cl
mov dh,dl ;head in dh
mov dl,0 ;erase dl
pop bx ;load old bx
pop ax ;load old ax
ret
``` This read disk code likely is not causing the issues as I have loaded many other sectors with this.