软盘引导扇区代码中各类数学计算的目标及实现方式咨询
软盘引导扇区中DIV/MUL类计算的目标与实现分析
一、示例代码的计算逻辑拆解
先逐行解析给出的x86汇编代码:
XOR DX,DX ; 清零DX寄存器,为16位除法DIVW做准备(DIVW的被除数是DX:AX组合寄存器) DIVW 0x7C18 ; DX:AX除以内存地址0x7C18存储的数值,商存入AX,余数存入DX INC DL ; 取余数的低8位(DL)加1 MOV 0x7C3B, DL ; 将计算结果写入内存地址0x7C3B XOR DX, DX ; 再次清零DX,准备下一次除法 DIVW 0x7C1A ; DX:AX除以内存地址0x7C1A存储的数值,商存AX,余数存DX MOV 0x7C2A,DL ; 将余数低8位写入0x7C2A MOV 0x7C39,AX ; 将商写入0x7C39 RET
这段代码的核心目标是把线性逻辑扇区号转换为软盘的CHS(柱面/磁头/扇区)物理寻址参数——软盘依赖CHS寻址来定位数据,引导扇区要加载后续程序时,必须完成这种映射。
二、引导扇区中DIV/MUL计算的通用目标
- CHS地址转换:这是最常见的场景。软盘每磁道扇区数、磁头数是固定参数(比如1.44MB软盘为每磁道18扇区、2个磁头),通过除法拆分逻辑扇区号:
- 逻辑扇区号 ÷ 每磁道扇区数,余数+1就是物理扇区号(软盘扇区从1开始计数)
- 上一步的商 ÷ 磁头数,余数为磁头号,商为磁道号
- 内存地址计算:引导扇区需要把后续扇区加载到指定内存位置,用MUL计算总偏移量,比如
AX = 扇区大小 × 扇区数,再加上基地址得到目标内存地址 - 校验值计算:部分引导扇区会用MUL/DIV计算校验和,验证扇区数据的完整性
三、具体实现逻辑(以CHS转换为例)
以1.44MB软盘为例,逻辑扇区号转CHS的标准流程:
- 把逻辑扇区号存入AX,执行
XOR DX,DX确保被除数的高位清零 - 执行
DIV 18,余数加1得到物理扇区号(对应示例中的INC DL操作) - 用第一步的商作为新的被除数,执行
DIV 2,余数就是磁头号,商就是磁道号 - 将计算出的CHS参数存入指定内存,供后续磁盘读取指令(如INT 13H)调用
四、关键细节
- 软盘的硬件参数(每磁道扇区数、磁头数)会因软盘类型变化,所以示例中用内存地址
0x7C18、0x7C1A存储常量,而非直接写立即数,方便适配不同设备 - 16位DIV指令执行前必须清零DX,否则会因被除数高位存在脏数据导致计算错误,示例中两次
XOR DX,DX就是为了避免这个问题
内容的提问来源于stack exchange,提问作者Shankar Tiwari ji
相关产品推荐
相关产品推荐

