王爽《汇编语言》实验17——编写包含多个功能子程序的中断例程

来源:互联网 发布:网页小游戏源码下载 编辑:程序博客网 时间:2024/05/21 14:43

;==========================================================================

;实验17 编写包含多个功能子程序的中断例程

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

;AH寄存器传递功能号,0表示读,1表示写

;DX寄存器传递要读写的扇区的逻辑扇区号

;ES:BX指向存储读出数据或者写入数据的内存区

;==========================================================================

ASSUMECS:CODE

 

DATASEGMENT

   ;用于检验中断例程

   DB32DUP("Welcome to masm!")    

DATAENDS

   

CODESEGMENT

START:

   ;安装新的 INT 7CH 中断

   PUSHCS

   POPDS

   MOVSI,OFFSET NEW_INT7CH_START 

   MOVAX,0

   MOVES,AX

   MOVDI,200H

   MOVCX,OFFSET NEW_INT7CH_END-OFFSET NEW_INT7CH_START

   CLD

   REPMOVSB

       

   ;设置新的中断向量表

   CLI

   MOVWORDPTRES:[4*7CH],200H

   MOVWORDPTRES:[4*7CH+2],0

   STI

   

   ;测试新的 INT 7CH 中断

   MOVAX,DATA

   MOVDS,AX

   

   ;

   PUSHDS;ES:BX指向要写的单元

   POPES

   MOVBX,0

   

   MOVDX,0

   MOVAL,1

   MOVAH,1

   INT7CH

   

   ;     ;ES:BX指向要读的单元

   MOVAX,2000H   ;读到2000:0

   MOVES,AX

   MOVBX,0

   

   MOVDX,0

   MOVAL,1

   MOVAH,0

   INT7CH

   

   MOVAX,4C00H

   INT21H

   

   ;新的 INT 7CH 中断

;-----------------------------------------------------------------------------------   

;功能:用逻辑扇区号对软盘进行读写

;参数:  (AH)=功能号,0=,1=;(DX)=要读写的扇区的逻辑扇区号,(AL)=读取或写入的扇区数

;      ES:BX指向存储读出数据或者写入数据的内存区

;返回: INT 7CH 的返回,操作成功:(AH)=0,(AL)=读入或写入的扇区数,操作失败:(AH)=错误代码  

   NEWINT7 PROCNEAR

   NEW_INT7CH_START:

   JMP NEW_INT7CH_REAL_START

   TABLE DW SUB0-NEWINT7+200H,SUB1-NEWINT7+200H

   

   NEW_INT7CH_REAL_START:

   PUSHDX

   PUSHCX

   PUSHSI

   MOVCL,AH

   MOVCH,0

   SHLCX,1

   MOVSI,CX

   CALL CONVERT

   CALLWORDPTRCS:[TABLE-NEWINT7+200H+SI]

   JMP NEW_INT7CH_RET

   

   SUB0:

   ;不能在子程序中再来POP!!因为在调用子程序的时候会压入IP

   ;此时POP会导致一系列不可预知的错误

   MOVDL,0

   MOVAH,02

   INT13H 

   RET

   

   SUB1:

   MOVDL,0

   MOVAH,03

   INT13H

   RET

   

   NEW_INT7CH_RET:

   POPSI

   POPCX

   POPDX

   IRET

   

   CONVERT:

   ;-------------------------------------------------------------------------------   

   ;功能:根据逻辑扇区号计算物理扇区号

   ;参数:(DX)=逻辑扇区号(0~2879)

   ;返回:(DH)=面号(0,1),(CH)=磁道号(1~79),(CL)=扇区号(1~18)

   PUSHAX

   MOVAX,DX

   MOVDX,0

   MOVCX,1440

   DIVCX     ;(AX)=面号

   MOVDH,AL 

   PUSHDX

   MOVAX,DX

   MOVDX,0

   MOVCX,18

   DIVCX     ;(AX)=磁道号

   MOVCH,AL

   ADDDX,1   ;(DX)=扇区号

   MOVCL,DL

   POPDX

   POPAX

   RET

   ;-------------------------------------------------------------------------------   

   

   NEW_INT7CH_END:

   NOP

   NEWINT7 ENDP

;-----------------------------------------------------------------------------------   

CODEENDS

END START

0 0