汇编网首页登录博客注册
fpamc的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态

[2012-05-30 18:32] 17章作业和实验17(已验证)

第十七章

检测点17.1 

“在int 16h中断例程中,一定有设置IF=1的指令。”这种说法对吗?

正确,当键盘缓冲区为空时,如果设置IF=0,int 9中断无法执行,循环等待会死锁。


以下也实验17的源码。
以经过验证。
验证方法为。
在虚拟机环境,配有虚拟软驱。

1.安装中断例程
2.运行写软盘程序,将屏幕数据写到软盘
3.清屏
4.运行读软盘程序,将软盘数据读到屏幕。


assume cs:CG
;名称:int 7ch读写磁盘中断
;
;入口参数:ah=功能号(0:读,1:写)
;      al=驱动器号
;      dx=寄存器传递要读写的扇区的逻辑扇区号
;      用es:bx指向磁盘缓冲
;
;物理扇区号与逻辑扇区号关系公式
;逻辑扇区号=(面号*80+磁道号)*18+扇区号-1
;面号      =int(逻辑扇区号/1440)
;磁道号    =int(rem(逻辑扇区号/1440)/18)
;物理扇区号=rem(rem(逻辑扇区号/1440)/18)+1
;
;出口参数:
;CF=0——操作成功,AH=00H,AL=传输的扇区数
;否则,AH=状态代码
;
CG segment

distr:jmp short disk
   
   table dw disk1,0
   ;用来定位读/写子程序,和保存临时数据
   
disk :push si
   push cx
   
   cmp ah,1
   ja siret
   cmp dx,2879
   ja siret
   ;检测错误
   
   mov si,2
   mov word ptr table[si],ax
   ;保存假功能号和驱动器号,备用
   
   xor si,si
   call word ptr table[si]
   
siret:pop cx
   pop si
   iret
   
;以下为读/写磁盘子程序
disk1:mov ax,dx
   xor dx,dx
   mov cx,1440
   div cx
   push ax
   ;求磁头号,并存入栈
   ;**********************
   
   mov ax,dx
   mov dl,18
   div dl
   mov ch,al
   mov cl,1
   ;求磁道号,同时置扇区起始
   ;**********************
   
   mov al,ah
   add al,1
   
   mov si,3
   cmp byte ptr table[si],1
   je num
   ;检测是读or写
   
   mov ah,2
   ;求要操作的扇区数,同时置功能号
   ;**********************
   
nums :pop dx
   mov dh,dl
   
   add si,1
   mov dl,cs:[si]
   ;将磁头号出栈,并设置驱动器
   ;**********************
   
   int 13h
   
   ret
   ;**********************
   
;以下为写磁盘的功能号设置
num  :mov ah,3   
   jmp short nums
   
   ;**********************
   
disend:nop

   ;**********************

;以下为安装程序
start:push cs
   pop ds
   xor si,si
   
   mov es,si
   mov di,200h
   
   mov cx,offset disend - offset distr
   
   cld
   rep movsb
   
   cli
   mov word ptr es:[7ch*4],0
   mov word ptr es:[7ch*4+2],20h
   sti
   
   mov ax,4c00h
   int 21h
   
CG ends
end start


此程序增加了对驱动器的选择。可以为磁盘,也可以为软盘。
评论次数(1)  |  浏览次数(896)  |  类型(汇编作业) |  收藏此文  | 

[  chinatree   发表于  2012-06-17 22:14  ]

自己验证了即可,代码太复杂,看着费劲。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码