You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过BIOS调用读取多个扇区?FAT12引导扇区加载BOOT.BIN问题

引导扇区FAT12多扇区读取问题修复

现有代码核心错误点

  • FAT项偏移未赋值给地址寄存器:计算得到FAT项的偏移量存储在ax后,未将ax赋值给bx,导致所有FAT读取操作都指向FAT段的0地址,无法拿到正确的后续簇号
  • FAT值处理逻辑顺序颠倒:当前代码先对偏移量做奇偶掩码、移位处理,再读取FAT表内容,处理对象完全错误。正确逻辑应为先读取偏移处的16位FAT值,再根据偏移的奇偶性对读到的FAT值做裁剪处理
  • 结束分支栈不平衡:触发finishedread分支时,之前压入栈的es、bx没有出栈,栈指针异常,跳转执行BOOT.BIN时会出现不可预期的错误

修正后的核心代码

foundfile:
        mov word ax,[es:di+0x0f]
        push ax ;保存文件起始簇号
        ; 初始化加载目标地址 0x40000 = second_boot_segment * 16 + 0
        mov dx,second_boot_segment
        mov es,dx
        xor bx,bx
        
read_file_sector:
        pop ax ;取出当前簇号
        mov byte dl,[drive_num]
        mov cx,ax
        add cx,31 ; 簇号转LBA逻辑验证正确
        push ax ;保存当前簇号
        mov al,1
        call readdisk
        pop ax ;取出当前簇号,用于查找下一个簇
            
find_clusters:
        push es
        push bx
        mov cx,fat_segment
        mov es,cx
        ; 计算FAT项偏移:offset = 簇号 * 3 / 2
        xor dx,dx
        mov cx,3
        mul cx
        shr ax,1
        ; 把计算得到的偏移赋值给bx
        mov bx,ax
        ; 暂存奇偶判断标记
        pushf
        ; 先读取FAT项的16位值
        mov word ax,[es:bx]
        ; 恢复奇偶判断标记
        popf
        
        jz short evennum
        
oddnum:
        ; 簇号为奇数,取高12位
        shr ax,4
        jmp short find_clusters_continued
        
evennum:
        ; 簇号为偶数,取低12位
        and ax,0x0fff
        
find_clusters_continued:
        cmp ax,0x0ff0
        jae short finishedread ; 读到文件结束簇
        
        pop bx
        pop es
        
        push ax ;保存下一个簇号
        add bx,512 ; 下一个扇区的目标地址偏移
        jmp short read_file_sector
        
finishedread:
        ; 先平衡栈再跳转
        pop bx
        pop es
        jmp second_boot_segment:0000
        jmp fatalerror

内容的提问来源于stack exchange,提问作者apersonwithacompiler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:57:04