我们主要以3.5英寸软盘为例,进行讲解。 3.5英寸软盘分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512个字节。
则:2面*80磁道*18扇区*512字节=1440KB≈1.44MB
磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘。只能以扇区为单位对磁盘进行读写。在读写扇区的时候,要给出面号、磁道号和扇区号。面号和磁道号从0开始,而扇区号从1开始。
如果我们通过直接控制磁盘控制器来访问磁盘,则需要涉及许多硬件细节。BIOS提供了对扇区进行读写的中断例程,这些中断例程完成了许多复杂的和硬件相关的工作。我们可以通过调用BIOS中断例程来访问磁盘。
BIOS提供的访问磁盘的中断例程为int 13h。读取0面0道1扇区的内容到0:200的程序如下所示。
mov ax,0 mov es,ax mov bx,200h mov al,1 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,2 int 13h
入口参数:
(ah)=int 13h的功能号(2表示读扇区)
(al)一读取的扇区数
(ch)=磁道号
(c1)=扇区号
(dh)一磁头号(对于软盘即面号,因为一个面用一个磁头来读写)
(dl)=驱动器号软驱从0开始,0:软驱A, 1:软驱B;
硬盘从80h开始,80h:硬盘C. 81h:硬盘D
es:bx指向接收从扇区读入数据的内存区
返回参数:
操作成功:(ah)=0} (al)=读入的扇区数
操作失败:(ah)=出错代码
将0:200中的内容写入0面0道1扇区。
mov ax,0 mov es,ax mov bx,200h mov al,1 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,3 int 13h
入口参数:
(ah)=int 13h的功能号(3表示写扇区)
(al)~写入的扇区数
(ch)二磁道号
(c1)一扇区号
(dh)=磁头号(面)
(dl)=驱动器号软驱从0开始,0:软驱A} 1:软驱B;
硬盘从80h开始,80h:硬盘C} 81h:硬盘D
es:bx指向将写入磁盘的数据
返回参数:
操作成功:(ah)=0, (al卜写入的扇区数
操作失败:(ah卜出错代码
注意,下面我们要使用int 13h中断例程对软盘进行读写。直接向磁盘扇区写入数据是很危险的,很可能覆盖掉重要的数据。如果向软盘的0面0道1扇区中写入了数据,要使软盘在现有的操作系统下可以使用,必须要重新格式化。在编写相关的程序之前,必须要找一张空闲的软盘。在使用int 13h中断例程时一定要注意驱动器号是否正确,千万不要随便对硬盘中的扇区进行写入。
编程:将当前屏幕的内容保存在磁盘上。
分析:1屏的内容占4000个字节,需要8个扇区,用0面0道的1}8扇区存储显存中的内容。程序如下。
assume cs:code code segment start: mov ax,0b800h mov es,ax mov bx,0 mov al,8 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,3 int 13h mov ax,4c00h int 21h code ends end start