16位实模式x86汇编磁盘读取例程异常,无法正常读取10个扇区
问题分析与修复方案
你的磁盘读取例程核心问题出在循环终止条件的错误设置,以及对int 0x13磁盘读取调用参数的理解偏差:
1. 循环终止条件错误
你设置的终止判断是cmp bx, 0x7e00+0xa,这里的0xa是10,意味着只打印10个字节就停止循环。但你通过int 0x13读取的是10个扇区,每个扇区标准大小是512字节,总数据量是10*512=5120字节。要打印所有读取的内容,终止条件需要对应到总字节数的末尾地址:0x7e00 + 5120。
2. 对int 0x13参数的误解
al寄存器在int 0x13的ah=0x2(磁盘读)功能中,指定的是要读取的扇区数量,不是字节数。你设置al=0xa确实是读取10个扇区,但后续的打印逻辑没匹配这个数据量。
修复后的代码
mov bl, dl mov ah, 0x2 mov al, 0xa ; 读取10个扇区(每个512字节) mov ch, 0 ; 柱面号:0 mov cl, 2 ; 起始扇区号:2 mov dh, 0 ; 磁头号:0 mov dl, bl ; 驱动器号(保留启动时BIOS传入的dl值) mov bx, 0x0 mov es, bx mov bx, 0x7e00 ; 数据加载地址:ES:BX = 0x0000:0x7e00 int 0x13 jc __end ; 读取失败则跳转到结束逻辑 mov bx, 0x7e00 mov cx, 0xa*512 ; 总打印字节数:10扇区 × 512字节/扇区 __loop: mov ah, 0x0e mov al, [bx] int 0x10 ; 调用BIOS中断打印当前字节 dec cx jz __end ; 所有字节打印完成,跳转到结束 inc bx jmp __loop __end: mov ah, 0x0e mov al, "!" int 0x10 jmp $ times 510 - ($ - $$) db 0x0 dw 0xaa55 times 2048 db 'A' ; 填充4个扇区的'A',剩余6个扇区为0
额外说明
- 修复后的代码用
cx寄存器记录剩余要打印的字节数,每次循环递减,直到cx=0终止,确保打印完所有10个扇区的内容。 - 你填充的
times 2048 db 'A'对应4个扇区,所以前2048个打印字符是'A',后面3072个是0(空字符),最后输出'!'标识结束。 - 如果只是验证磁盘读取是否成功,可以简化打印逻辑(比如只打印每个扇区的第一个字节),避免大量重复字符影响观察。
内容的提问来源于stack exchange,提问作者Alessio Spinellino
相关产品推荐
相关产品推荐

