• 磁盘管理文件及应用


    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

  • 相关阅读:
    17种高效选聘方法
    三招让你从求职者中脱颖而出(转)
    仓山有感
    同事就是同事,职场没有兄弟姐妹
    enable worker process
    央企
    关于IIS
    td
    About Application Pool
    iis 7 application pool
  • 原文地址:https://www.cnblogs.com/fengdashen/p/3706233.html
Copyright © 2020-2023  润新知