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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:36:01