汇编语言(王爽)实验十七

实验十七

用面号、磁道号、扇区号访问磁盘不太方便,考虑对它们进行统一编号

方法如下,称此编号为逻辑扇区编号

汇编语言(王爽)实验十七_第1张图片

逻辑扇区号=(面号*80 + 磁道号)*18 + 扇区号-1
反过来
面号=int(逻辑扇区号/1440)
磁道号=int(rem(逻辑扇区号/1440)/18)
扇区号=rem(rem(逻辑扇区号/1440)/18)+1
int():取商
rem():取余数

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

ah传递功能号:0表示读 1表示写

dx传递逻辑扇区号

es:bx指向读出/写入数据的内存区

提示:可调用int 13h进行实际的读写

assume cs:code

code segment
	start:	mov ax,cs
			mov ds,ax
			mov si,offset int7cstart
			
			mov ax,0
			mov es,ax
			mov di,200h
			
			mov cx,offset int7cend-offset int7cstart
			cld
			rep movsb
			
			cli
			mov ax,0
			mov ds,ax
			mov word ptr ds:[4*7ch],200h
			mov word ptr ds:[4*7ch+2],0
			sti
			
			mov ax,4c00h
			int 21h
            
int7cstart:	cmp ah,1	
			ja ok		; 违法的功能号
			
			push ax		; 保护现场
			push bx
			push cx
			push dx
			
			push ax		; ah中存着功能号
			
			mov ax,dx	; 传递逻辑扇区号
			mov dx,0
			mov cx,1440
			div cx
			push ax		; ax保存得到的商,即面号,入栈保存
			
			mov cx,18
			mov ax,dx	; 所得结果的余数传递给ax,继续做除法
			mov dx,0
			div cx
			push ax		; ax保存得到的商,即磁道号
			inc dx		; 计算出扇区号
			push dx		; 入栈保存
			
			pop ax
			mov cl,al	; 扇区号
			pop ax
			mov ch,al	; 磁道号
			pop ax
			mob dh,al	; 面号
			mov dl,0	; 驱动器号
			pop ax		; 弹出ax,其中ah中存着功能号
			mov al,1	; 扇区数
			
			cmp ah,0
			je read
			cmp ah,1
			je write
			
	read:	mov ah,2
			jmp short func
	write:	mov ah,3
			jmp short func
	func:	int 13h
			
			pop dx		; 恢复现场
			pop cx
			pop bx
			pop ax
			
      ok:	iret
      
  int7cend:	nop
  
  code ends
  end start

你可能感兴趣的:(汇编)