16位汇编内存读取异常:已设为1却返回0的问题求助
解决思路
修正内存地址匹配问题(核心错误)
实模式下物理地址由「段寄存器值×16 + 偏移量」计算得出:- 你在bootloader中设置
ES=0x7100、BX=0,INT 0x13会把配置区数据加载到物理地址0x7100 << 4 + 0 = 0x71000 - 但后续读取时用
MOV AL, BYTE [0x7101],若DS寄存器值为0,实际访问的物理地址是0 <<4 +0x7101=0x7101,两者完全不匹配。
修正方案二选一:- 调整bootloader的加载地址:把
MOV AX,0x7100改成MOV AX,0,MOV BX,0x7100,这样数据会加载到物理地址0*16+0x7100=0x7100,和你后续读取的地址对应。 - 调整读取代码的段地址:读取时确保DS=0x7100,然后读取
BYTE [0x0001];或者使用段超越前缀,比如MOV AL, BYTE ES:[0x0001](前提是ES仍保留0x7100值)。
- 调整bootloader的加载地址:把
- 你在bootloader中设置
验证INT 0x13读扇区的正确性
- 检查
DL寄存器的值:你通过BYTE [0x7FFF]获取驱动器号,要确认该地址存储的是正确的软盘驱动器号(通常软盘为0x00),可在调用INT 0x13前加入调试代码打印DL的值。 - 打印INT 0x13的错误码:在
error1分支中,AH寄存器存储了INT 0x13的错误返回码,可通过BIOS中断(如0x10)打印AH的值,排查读取失败的具体原因。 - 确认扇区参数:CL=17是起始扇区号,要确保第17、18扇区确实是你预留的配置区,避免扇区编号计算错误(比如bootloader是否占用了前16扇区?)。
- 检查
检查配置区的实际数据
用磁盘镜像编辑工具(如WinHex)打开软盘镜像,直接查看第17、18扇区的内容,确认对应物理地址的第二个字节(偏移0x1)确实为0x01,排除镜像中配置数据本身错误的可能。确认段寄存器的一致性
跳出bootloader后,检查DS、ES等段寄存器的值是否被后续代码修改,若段寄存器值变化,会导致内存访问的物理地址偏离预期。
内容的提问来源于stack exchange,提问作者Chaise Manners
相关产品推荐
相关产品推荐

