编写用逻辑扇区号读写软盘的中断例程

求安装一个新的int 7ch中断例程,实现通过逻辑扇区号对软盘进行读写操作

参数说明:

1、用ah寄存器传递功能号,0表示读,1表示写

2、用bx寄存器传递要读写的扇区的逻辑扇区号

3、用es:si指向存储读出数据或写入数据的缓冲区

三、分析

      分析可得逻辑扇区号和物理扇区号对应关系如下:

逻辑扇区号 = (面号*80+磁道号)*18+扇区号-1

      那么可以使用下面的算法来计算

int():描述性运算符,取商

rem():描述性运算符,取余数
逻辑扇区号 = (面号*80+磁道号)*18+扇区号-1

面号 = int(逻辑扇区号/1440)

磁道号 = int(rem(逻辑扇区号/1440)/18)

扇区号 = rem(rem(逻辑扇区号/1440)/18)+1

四、详细设计

assume cs:code


code segment

;中断例程:通过逻辑扇区号对软盘读写
;参数:ah功能号:0表示读,1表示写;dx要读写的逻辑扇区号;es:si存储读写数据的缓冲区
; al写入的扇区数,bl驱动器号
int7ch:
 call count
 
 cmp ah,0  ;ah为0,转跳到读
 je read
 cmp ah,1  ;ah为1,转跳到写
 je write 
 mov ah,123  ;ah值不合法,返回
 iret

read:
 mov ah,2
 jmp short start
 
write:
 mov ah,3
 jmp short start
 
start:
 mov dl,bl
 mov bx,si
 int 13h
 
 iret
 

;子程序:完成逻辑扇区的分析
;参数:dx:逻辑扇区号
;返回值:dh:面号,ch:磁道号,cl:扇区号
count:
 push ax
 push bx
 
 mov ax,dx
 mov dx,0
 mov bx,1440
 div bx
 mov bh,al ;逻辑扇区号/1440的商是面号,暂存于bh中
    ;余数保存在dx中
 
 mov ax,dx
 mov bl,18
 div bl
 mov ch,al ;商是磁道号,保存在ch中
 
 mov dh,bh ;面号传送到dh中
 
 mov cl,ah
 add cl,1 ;余数+1是扇区号,保存在cl中
 
 pop bx
 pop ax
 ret
 

setup:
 ;初始化安装过程
 mov ax,cs
 mov ds,ax
 mov si,offset int7ch
 
 mov ax,0
 mov es,ax
 mov di,200h
 
 ;开始安装
 mov cx,offset setup-offset int7ch
 cld
 rep movsb
 
 ;设置中断向量表
 mov ax,0
 mov es,ax
 mov word ptr es:[7ch*4],0   ;ip
 mov word ptr es:[7ch*4+2],20h  ;cs
 
 ;安装结束,返回操作系统
 mov ax,4c00h
 int 21h
 
code ends
end setup
原文地址:https://www.cnblogs.com/qintangtao/p/2869094.html