磁盘管理文件及应用

DOS磁盘文件管理功能调用时DOS功能调用的重要组成部分

DOS磁盘文件管理功能的调用

在下面介绍的DOS磁盘文件管理功能调用中,用于表示文件名的ASCII字符串必须是ASCII码值0结尾(不是数字符号0)这样的字符串通常称为ASCII串,文件名可以使包含盘符和路径的文件标识,如果没有盘符,者认为是当前胖,如果路径不是从根目录开始,那么就认为是从当前目录了开始

 

DOS功能的调用

1:建立文件(创建新的或者刷新老的文件)

入口参数:DS:DX = 代表文件名的字符串的首地址

CX = 文件属性:

出口参数:CF = 0, 表示成功,AX等于 文件柄

     CF = 1 表示失败,AX = 错误代码

说明,可以指定文件的属性如下: 00 H普通文件

                01 H 只读文件

                02 H 隐含文件

                04 H系统文件

创建文件成功后,文件长度定为0

2:打开文件(3DH号功能的调用)

功能:打开文件,入口参数:DS:DX = 代表文件名的字符串的首地址

             AL = 取存方式

出口参数:CF= 0,表示成功AX = 文件号

     CF = 1,表示失败,AX = 错误代码

说明:(1)存取方式规定如下:

              00H 只读方式

              01H 只写方式

              02H 读写方式

    (2)打开文件成功后,文件指针定位于开始的第一个字节

3:读文件(3FH号功能的调用)

  功能:读文件
  入口参数:BX = 文件号

       CX = 读入字节数

       DS:DX= 准备存放所读数据的缓冲区首地址

  出口参数:CF = 0 表示成功,AX = 实际读到的字节数

       CF = 1,表示失败,AX = 错误代码

说明:  (1)通常情况下,实际读到的字节数与欲读入的的字节数相同,除非不够读

     (2)缓冲区应保证能容下说读到的数据

    (3)文件应该以读的心思打开

    (4)读文件后,文件指针应当定位到读出字节之后的第一个地址处

4:写文件(40H)

功能:写文件

入口参数:BX = 文件号

     CX = 写盘字节数

     DS:DX = 存放字节数的缓冲区首地址

出口参数:出口参数:CF  = 0,表示成功,AX = 实际独到的字节数

          CF = 1,表示失败,AX = 错误代码

说明:(1)通常情况下,实际读出的字节数与欲写的世界树相同,除非写磁盘已经满了

   (2)文件应该以写或者读的形式打开

   (3)写文件后,文件指针将定位到写入字节之后的第一个字节处

关闭文件:(3EH功能调用)

功能:关闭文件:

入口参数:BX = 文件句柄号

出口参数:CF = 0,表示成功

     CF = 1 ,表示失败

文件号是打开该文件时,系统给定的文件号

移动文件读写指针(42H号功能的调用)

入口参数:BX = 文件号

     CX = DX = 移动位移量

     AL = 移动方式

出口参数:CF = 0,表示成功,此时DX : AX  = 移动后文件指针值    

     CF  = 1,表示失败,此时AX = 1,表示无效的移动,AX = 6,表示无效文件号

说明:(1)文件指针值是以文件首字节为0计算的

    (2)移动的目的,

    00H表示 移动文件指针的值 =  0 + 移动位移量

    01H  = 文件指针的值加上移动位移量

    02H = 文件长(文件尾部) +移动的位移量

删除文件:(41H)的调用

功能:删除文件

入口参数:DS:DX = 代表文件名的字符串首地址

出口参数:CF = 0 表示成功

     CF = 1,表示失败,AX = 错误代码

说明:只能删除一个普通的文件

写一个文本显示内容程序,文本文件为固定当前目录下的TEST.TXT文件

 1 ;程序名功能 显示当前目录文本下的TEST.TXT内容
 2 ;符号常量定义
 3 EOF = 1AH  ;文件结束符的ASCII
 4 ;数据段
 5 DSEG         SEGMENT
 6 FANME     DB 'TEST.TXT',0
 7 ERROR1    DB    'File not found ',07H,0
 8 ERROR2     DB    'Reading error',07H,0
 9 BUFFER     DB ?
10 DSEG     ENDS
11 ;
12 ;代码段
13 CSEG        SEGMENT
14                 ASSUME     CS:CSEG,DS:DSEG
15     START:    MOV AX,DSEG
16                     MOV DS,AX
17                     
18                     MOV    DX,OFFSET    FANME;也就是把变量FANME的偏移放入DX入口
19                     MOV    AX,3D00H ;AH = 3DH,AL =  00H,打开指定文件其中 00H表示以只读方式打开
20                     INT        21H
21                     JNC    OPEN_OK;打开成功进行跳转
22                     MOV    SI,OFFSET        ERROR1
23                     CALL     DMESS
24                     JMP        OVER
25                     ;
26                     
27     OPEN_OK:     MOV BX,AX  ;保存文件句柄
28     CONT: CALL READCH
29                   JC            READEER
30                   CMP AL,EOF
31                   JZ            TYPE_OK
32                   CALL        PUTCH
33                   JMP        CONT
34                   
35     READEER: MOV SI,OFFSET ERROR2
36                             CALL    DMESS
37                             ;
38     TYPE_OK:MOV        AH,3EH ;关闭文件调用:BX= 文件号,CF  = 0,表示成功,CF = 1,表示失败
39                          INT        21H
40                          
41                          
42     OVER:        MOV AH, 01H
43                         INT      21H
44                         MOV    AH,4CH
45                         INT        21H
46     
47 READCH         PROC
48                     MOV        CX,1 ;准备读出一个字节
49                     MOV        DX,OFFSET    BUFFER
50                     MOV        AH,3FH;读文件入口参数BX = 文件号,CX = 读入字节数,DS:DX= 准备存放所读数据的缓存区首地址
51                     INT            21H
52                     JC            READCH2
53                     CMP        AX,CX
54                     MOV        AL,EOF
55                     JB            READCH1
56                     MOV        AL,BUFFER
57 READCH1:CLC ;清除进位标志
58 READCH2:RET ;段间返回
59 READCH                ENDP
60 
61 DMESS            PROC
62 DMESS1:MOV        DL,[SI]
63                     INC            SI
64                     OR            DL,DL;字符串以0结尾因此用来判断DL是否到字符串的末尾
65                     JZ             DMESS2
66                     MOV        AH,2 ;向标准输出设备写一个字符串
67                     INT         21H
68                     JMP        DMESS1
69 DMESS2:RET  ;段间返回指令  
70 DMESS     ENDP
71 
72 PUTCH PROC
73                 PUSH        DX
74                 MOV        DL,AL
75                 MOV         AH,2
76                 INT            21H
77                 POP        DX
78                 RET
79 PUTCH         ENDP
80 
81 CSEG        ENDS
82                 END        START
View Code

 写一个能把键盘输入的全部字符串存入某个文件的程序(直到按下CTRL+Z按键的值是1AH为止)

 1 ;程序功能:把键盘上输入的全部存入文件TEST.TXT中
 2 ;常量定义
 3 EOF  = 1AH
 4 ;数据段
 5 DSEG         SEGMENT
 6 FANME        DB 'TEST.TXT',0
 7 ERROR1    DB    'Can    not    create file',07H,'$'
 8 ERROR2    DB 'Writing    error',07H,'$'
 9 BUFFER    DB ?
10 DSEG        ENDS
11 
12 CSEG            SEGMENT
13                     ASSUME        CS:CSEG,DS:DSEG
14 START:        MOV        AX,DSEG
15                     MOV        DS,AX
16                     
17                     MOV        DX,OFFSET    FANME
18                     MOV        CX,00H
19                     MOV        AH,3CH
20                     INT            21H
21                     JNC        CREA_OK
22                     
23                     MOV        DX,OFFSET    ERROR1
24                     CALL        DISPMESS
25                     JMP        OVER
26                     
27 CREA_OK:MOV BX,AX
28 CONT:          CALL GETCHAR
29                         PUSH  AX
30                         CALL    WRITECH
31                         POP    AX
32                         JC    WERROR
33                         CMP        AL,EOF
34                         JNZ        CONT
35                         JMP    CLOSEF
36 WERROR:MOV    DX,OFFSET    ERROR2
37                         CALL DISPMESS
38 CLOSEF:MOV    AH,3EH
39                   INT        21H
40 OVER:        MOV    AH,1H
41                     INT     21H
42                     MOV    AH,4CH
43                     INT        21H
44                     
45                     
46 WRITECH        PROC
47                 MOV        BUFFER,AL
48                 MOV        DX,OFFSET    BUFFER
49                 MOV        CX,1
50                 MOV        AH,40H
51                 INT            21H
52                 RET
53 WRITECH    ENDP
54 
55 GETCHAR        PROC
56         MOV        AH,1
57         INT            21H
58         RET
59 GETCHAR        ENDP
60 
61 DISPMESS        PROC
62                 MOV    AH ,9
63                 INT        21H
64                 RET
65 DISPMESS    ENDP
66 
67 CSEG        ENDS
68                 END    START
View Code

 

 

比较重要的子程序程序:

(1)显示DOS调用,类似于printf函数式DISPMESS

入口参数:DS:DX = 需要输出字符串的首地址,字符串内部以字符‘$’为结束标志

比如要显示ERROR DB 'write fail',0,'$'

调用函数之前,要进行 MOV DX,OFFSET  ERROR

           CALL  DISPMESS

DISPMESS    PROC
            MOV    AH,9
            INT    21H
            RET
DISPMESS    ENDP

(2)显示DOS调用,类似于putchar,这个功能用于换行和光标移到下一行首页

入口参数:DL = 要输出的字符的ASCII

出口参数:无

函数为NEWLINE

NEWLINE  PROC
        PUSH AX
        PUSH DX
        MOV  DL,0DH ;回车符的ASCII是0DH
        MOV  AH,2
        INT    21H
        MOV   DL,0AH;换行符的ASCII是0AH
        MOV    AH,2
        INT    21H   
        POP    DX
        POP    AX
        RET
NEWLINE    ENDP        

 

(3)DOS调用功能,相当于scanf,调用之前,一般要给出缓冲区的首地址

入口参数:DX = 缓冲区首地址

出口参数:AL = 接收到的输入字符串在缓冲区中

例如定义缓冲区为BUFF DB 128

           DB  ?

           DB  128 DUP (0)

调用函数之前,要来一个 MOV DX,OFFSET BUFF

MOV    AH,10
INT    21H

 

(4)打开文件,类似于open

 其中:FANME DB ’test.txt‘;即是FANME是文件名

3D00H是AH = 3D,AL = 00H,00H表示只读的方式打开文件

 MOV  DX,OFFSET FANME
   MOV  AH,3D00H
 INT   21H
 JNC   OPNN_OK

 

(5)关闭文件类似于close,调用的参数是3EH

MOV    AH ,3EH
INT    21H 

 

(6)读取文件,相当于read,这个比较难,首先需要来一个循环,判断是否读到文件结尾

read实现的思路,保存文件句柄 —>从文件中读取一个字符—>读取出错者进行跳转—>判断读到字符结束符—>如果读到文件结束符进行跳转—>否则显示已经读到的字符—>继续

OPEN_OK: MOV BX,AX ;保存文件句柄
     CONT:CALL READCH;读取一个字节
      JC READERR;读取出错进行跳转
      CMP AL,EOF;比较是否读完,
      JZ TYPE_OK;读完进行跳转
      CALL PUTCH;显示已经读到的字符
      JMP CONT;继续读取

首先读取一个字符  CALL READCH

其中READCH :

READCH    PROC
  MOV CX,1 ;读入字节数为1
  MOV DX,0FFSET BUFFER ;缓冲区首地址
  MOV AH,3FH ;
  INT 21H ;
  JC READCH2 ;读出错返回
  CMP AX,CX ;比较稳健时候已经结束
  MOV AL,EOF ;设文件已经结束,置文件结束符
  JB READCH ;
  MOV AL,BUFFER ;文件未结束,取所读的字符
READCH1:CLC ;
READCH2:RET ;
READCH    ENDP

 读文件的入口参数:BX = 文件句柄

         CX = 入读字节数

         DX = 准备存入所读字节的缓冲首地址

 文件未结束,调用MOV AL,BUFFER来保存所读的字节,之后显示所读的字节,调用putchar

调用PUTCH

PUTCH    PROC
    PUSH DX
    MOV DL,AL
    MOV  AH,2
    INT 21H
    POP   DX
    RET
PUTCH    ENDP

 

(7)写一个文件:write写文件思路

 保存文件句柄-> 接受一个按键->向文件中写入所读的字符 ->如果写出错者进行跳转 ->遇到文件结束符吗? ->没遇到继续 ->遇到文件结束符,跳转到结束 

CREA_OK:MOV BX,AX;保存文件句柄
CONT:  CALL GETCHAR;接受一个键
    PUSH AX;
    CALL WRITECH;向文件中写入所读字符
    POP AX;
    JC WERROR;
    CMP AL,EOF;遇到文件结束符了吗
    JNZ CONT;没有继续进行前面的操作
    JMP CLOSE ;

getchar 这个函数调用dos功能中的1,出口参数为AL中所读到的字符

GETCHAR    PROC
  MOV AH,1
  INT 21H
  RET
GETCHAR ENDP

writech函数中调用的是40h

WRITECH PPOC
  MOV BUFFER,AL;把要写的一个字节送入缓冲区
  MOV DX,OFFSET BUFFER;置缓冲区地址
  MOV CX,1;置要写的字节数
  MOV AH,40H;写
  INT 21H;
  RET 返回
WRITECH ENDP

把一个文件复制粘贴到另一个文件中去

 1 ;程序功能,把文件1拼接到文件test2之后
 2 ;符号常量定义
 3 BUFFLEN = 512
 4 ;数据段
 5 DSEG        SEGMENT
 6 FNAME1 DB 'TEST1.txt',0
 7 FNAME2 DB 'TEST2.txt',0
 8 HANDLE1 DW 0
 9 HANDLE2 DW 0
10 ERRMESS1 DB 'CAN NOT OPEN FILE',07H,'$'
11 ERRMESS2 DB 'READING ERROR',07H,'$'
12 ERRMESS3 DB 'WRITING ERROR',07H,'$'
13 BUFFER DB BUFFLEN DUP (0)
14 DSEG ENDS
15 
16 CSEG SEGMENT
17                 ASSUME CS:CSEG,DS:DSEG
18 START: MOV AX,DSEG
19                 MOV DS,AX
20                 
21                 MOV DX,OFFSET FNAME1
22                 MOV AX,3D01H
23                 INT 21H
24                 JNC  OPEN_OK1
25 ERR1:MOV DX,OFFSET ERRMESS1
26             CALL DISPMESS
27             JMP OVER
28 
29 OPEN_OK1:MOV HANDLE1,AX
30                         MOV DX,OFFSET FNAME2
31                         MOV AX,3D00H
32                         INT 21H
33                         JNC OPENOK2
34 OPENOK2:MOV HANDLE2,AX
35                      MOV BX,HANDLE1
36                      XOR CX,CX
37                      XOR DX,DX
38                      MOV AX,4202H
39                      INT 21H
40 CONT: MOV DX,OFFSET BUFFER
41              MOV CX,BUFFLEN
42              MOV BX,HANDLE2
43              MOV AH,3FH
44              INT 21H
45              JC RERR
46              OR        AX,AX
47              JZ COPYOK
48              MOV CX,AX
49              MOV BX,HANDLE1
50              MOV AH,40H
51              INT 21H
52              JNC CONT
53 
54 WERR:MOV DX,OFFSET ERRMESS3
55                 CALL DISPMESS
56                 JMP SHORT COPYOK
57 
58 RERR: MOV DX,OFFSET ERRMESS2
59                 CALL DISPMESS
60 COPYOK:MOV BX,HANDLE1
61                     MOV AH,3EH
62                     INT 21H
63                     MOV BX,HANDLE2
64                     MOV AH,3EH
65                     INT 21H
66 OVER:MOV AH,1
67             INT 21H
68             MOV AH,4CH
69             INT 21H
70 DISPMESS PROC
71             PUSH AX
72             PUSH DX
73             MOV AH,9
74             INT 21H
75             POP DX
76             POP AX
77           RET
78 DISPMESS ENDP
79 
80 CSEG      ENDS
81                 END START
View Code

版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3706233.html

 

 

 

 

posted @ 2014-05-06 23:26  跨七海的风  阅读(411)  评论(0编辑  收藏  举报