欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-23 22:32:28
...

实验十七

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

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

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

逻辑扇区号=(面号*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
相关标签: 汇编