如何通过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
相关产品推荐
相关产品推荐

