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

实验十七

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

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

image-20200331181308238

逻辑扇区号=(面号*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
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值