BIOS和DOS中断大全_DOS中断_04文件操作功能

4、文件操作功能(File Operation Function)


接上文: BIOS和DOS中断大全_DOS中断_03磁盘管理功能


INT 21 中断

目录

3CH —创建文件
3DH —打开文件
3EH —关闭文件
41H —删除文件
43H —读取/设置文件属性
45H —复制文件句柄
46H —重定义文件句柄
4EH —查找到第一个文件
4FH —查找下一个文件
56H — 文件换名
57H —读取/设置文件的日期和时间
5AH —创建临时文件
5BH —创建新文件
67H —设置文件句柄数(最多文件数)
6CH —扩展的打开文件功能(打开、创建或替换文件)

 

(1)、功能3CH


功能描述:用指定的文件名创建一个新文件。如果指定的文件已存在,则设置其长度为0。创建后,该文件是打开的,并返回其句柄
入口参数:

AH=3CH
DS:DX=指定文件名字符串的地址(以0为字符串的结束标志)
CX=文件属性(这些标志位可以组合)

位0=1——只读
位2=1——系统
位5=1——归档位1=1——隐含
位3=1——卷标号
其它位保留不用,并置为0

出口参数:CF=0——创建成功,AX=文件句柄,否则,AX=错误号(03H、04H或05H),其含义见错误代码表

例程:
   1:  assume cs:code
   2:   
   3:  data segment
   4:      path db 'c:/123.txt', 0
   5:      successstr db 'create file success!$', 0
   6:      failstr db 'create file fail!$', 0
   7:  data ends
   8:   
   9:  code segment
  10:  start:
  11:      mov ax, data
  12:      mov ds, ax
  13:      
  14:      and cx, 00000001b
  15:      lea dx, path
  16:      xor ax, ax
  17:      mov ah, 3ch
  18:      int 21h 
  19:      jc fail
  20:  success:
  21:      lea dx, successstr
  22:      mov ah, 09h
  23:      int 21h
  24:      jmp codeEnd
  25:  fail:
  26:      lea dx, failstr
  27:      mov ah, 09h
  28:      int 21h
  29:  codeEnd:    
  30:      mov ax, 4c00h
  31:      int 21h
  32:  code ends
  33:  end start
(2)、功能3DH


功能描述:打开指定的驱动器、路径和文件名,并返回其文件句柄
入口参数:

AH=3DH
DS:DX=表明文件的字符串(以0为字符串的结束标志)
AL为打开方式: 位0~2

000—只读方式  001—写方式  010—读/写方式
位3保留,其值为0
位4~6共享模式 000—兼容模式001—不共享010—拒绝写
011—拒绝读100—不拒绝任何操作
位7继承标志——0/1:子进程继承或不继承句柄


出口参数:CF=0——打开成功,AX=文件句柄,否则,AX=错误号(02H、03H、04H、05H或0CH),其含义见错误代码表

例程:

   1:  assume cs:code
   2:   
   3:  data segment
   4:      path db 'c:/123.txt', 0
   5:      opensuccess db 'open file success!', 0ah, '$', 0
   6:      openfail db 'open file fail!', 0ah, '$', 0
   7:      closesuccess db 'close file success!', 0ah, '$', 0
   8:      closefail db 'close file success!', 0ah, '$', 0
   9:  data ends
  10:   
  11:  stack segment
  12:      db 160 dup(0)
  13:  stack ends
  14:   
  15:  code segment
  16:  start:
  17:      mov ax, data
  18:      mov ds, ax
  19:      
  20:      mov ax, stack
  21:      mov ss, ax
  22:      mov sp, 160
  23:      
  24:      mov ah, 3dh
  25:      lea dx, path
  26:      mov al, 0
  27:      int 21h
  28:      
  29:      jnc openSuc
  30:      
  31:      lea dx, openfail
  32:      mov ah, 09h
  33:      int 21h
  34:      jmp ext
  35:  openSuc:
  36:      push ax
  37:      lea dx, opensuccess
  38:      mov ah, 09h
  39:      int 21h
  40:   
  41:      mov ah, 3eh
  42:      pop bx
  43:      int 21h
  44:      
  45:      jnc closeSuc
  46:      lea dx, closefail
  47:      mov ah, 09h
  48:      int 21h
  49:      jmp ext
  50:      
  51:  closeSuc:
  52:      lea dx, closesuccess
  53:      mov ah, 09h
  54:      int 21h
  55:  ext:
  56:      mov ax, 4c00h
  57:      int 21h
  58:  code ends
  59:  end start
(3)、功能3EH


功能描述:关闭指定句柄的文件
入口参数:AH=3EH
BX=文件句柄
出口参数:CF=0——关闭成功,否则,AX=错误号(06H),其含义见错误代码表

例程:

请参看: (2) .功能3DH

 
(4)、功能41H


功能描述:删除指定的文件
入口参数:AH=41H
DS:DX=文件名字符串的地址
出口参数:CF=0——删除成功,否则,AX=错误号(02H、03H或05H),其含义见错误代码表

Note: 只读文件删不掉
例程:

   1:  assume cs:code
   2:   
   3:  data segment
   4:      path db 'c:/123.txt', 0
   5:      succ db 'delete file success!$', 0
   6:      fail db 'delete file fail!$', 0
   7:  data ends
   8:   
   9:  stack segment
  10:      db 160 dup(0)
  11:  stack ends
  12:   
  13:  code segment
  14:  start:
  15:      mov ax, data
  16:      mov ds, ax
  17:      
  18:      mov ax, stack
  19:      mov ss, ax
  20:      mov sp, 160
  21:      
  22:      mov ah, 41h
  23:      lea dx, path
  24:      int 21h
  25:      
  26:      jnc suc
  27:      lea dx, fail
  28:      mov ah, 09h
  29:      int 21h
  30:      jmp ext
  31:  suc:
  32:      lea dx, succ
  33:      mov ah, 09h
  34:      int 21h
  35:      
  36:  ext:
  37:      mov ax, 4c00h
  38:      int 21h
  39:  code ends
  40:  end start
(5)、功能43H


功能描述:读取或设置指定文件的属性
入口参数:

AH=43H
BX=文件句柄
DS:DX=文件名字符串的地址
AL=00H/01H——读取/设置文件属性
CX=文件属性:

位0=1——只读位1=1——隐含
位2=1——系统位3=1——卷标号
位5=1——归档其它位保留不用,并置为0
出口参数:CF=0——关闭成功,CX=文件属性,否则,AX=错误号(01H、02H、03H或05H),其含义见错误代码表

(6)、功能45H


功能描述:复制当前打开设备或文件的句柄,该句柄对应同样设备或文件的相同位置
入口参数:AH=45H
BX=待复制的文件句柄
出口参数:CF=0——复制成功,AX=新句柄,否则,AX=错误号(04H或06H),其含义见错误代码表

(7)、功能46H


功能描述:指定二个句柄,把第二句柄指向第一个句柄,即第二个句柄被重定向
入口参数:AH=46H
BX=文件或设备的句柄
CX=待重定向的文件句柄
出口参数:CF=0——重定向成功,否则,AX=错误号(04H或06H),其含义见错误代码表

例程:
   1:  ;------------------------------------------------
   2:  ; this sample to show redirect output to file
   3:  ;------------------------------------------------
   4:  assume cs:code
   5:   
   6:  data segment
   7:      path db 'c:/123.txt', 0
   8:      outdata db 'test output data!$', 0
   9:  data ends
  10:   
  11:  stack segment
  12:      db 160 dup(0)
  13:  stack ends
  14:   
  15:   
  16:  code segment
  17:  start:
  18:      mov ax, data
  19:      mov ds, ax
  20:      
  21:      mov ax, stack
  22:      mov ss, ax
  23:      mov sp, 160
  24:      
  25:      ; open file
  26:      mov ah, 3dh
  27:      lea dx, path
  28:      mov al, 010b     ; read/write mode
  29:      int 21h
  30:      jc ext
  31:      
  32:      ; open file success
  33:      ; redirect output to file 
  34:      mov bx, ax
  35:      mov cx, 1
  36:      mov ah, 46h
  37:      int 21h
  38:      
  39:      jc ext
  40:      
  41:      ; redirect success
  42:      mov ah, 09h
  43:      lea dx, outdata
  44:      int 21h
  45:      
  46:      mov bx, cx
  47:      mov ah, 3eh
  48:      int 21h
  49:      
  50:  ext:
  51:      mov ax, 4c00h
  52:      int 21h
  53:  code ends
  54:  end start
(8)、功能4EH


功能描述:获取第一个与给定的文件名相匹配的文件
入口参数:AH=4EH
DS:DX=给定文件名的字符串
CX=搜索时使用的文件属性: 位0=1——只读  位1=1——隐含
位2=1——系统  位3=1——卷标号
位4=1——目录  位5=1——归档
其它位保留不用,并置为0
出口参数:CF=1——操作失败,AX=错误号(02H、03H或12H),其含义见错误代码表,否则,操作成功,

DTA(Disk Transfer Area)按下列方式填入数据: 字节00~14H保留
字节15H匹配的文件属性
字节16~17H压缩的文件名
字节18~19H压缩的文件日期
字节1A~1DH文件大小
字节1E~2AH文件名字符串

Note:

首先我们需要改变DTA 表的存放地址. 默认的他存放在0x80。我们需要改变他,因为他是公用的,命令行的结果也存放在这里的.

mov ah, 0x1A
mov dx, DTA
int 21h

dx存放新的地址

偏移 大小 意思
0 23 bytes DOS需要的保留数据
0x15 Byte 文件属性
0x16 word 文件创建修改时间
0x18 word 文件创建修改日期
0x1A word 文件大小
0x1C word 未知
0x1E 13 bytes 以0结尾的文件名

例程:

   1:  assume cs:code 
   2:   
   3:  data segment
   4:      DTA db 2Ah dup(0)
   5:      sname db '*.exe', 0
   6:  data ends
   7:   
   8:  stack segment
   9:      db 160 dup(0)
  10:  stack ends
  11:   
  12:  code segment
  13:  ; 入口参数dl
  14:  printChar:
  15:      mov ah, 02h
  16:      int 21h
  17:      ret
  18:      
  19:  ; 入口参数dx
  20:  print:
  21:      push ax
  22:      push si
  23:      push bx
  24:      xor si, si
  25:      
  26:  local_001:
  27:      cmp byte ptr ds:[bx + si], 0
  28:      jz local_002
  29:      mov dl, ds:[bx + si]
  30:      call printChar
  31:      inc si
  32:      jmp local_001
  33:  local_002:
  34:      pop bx
  35:      pop si
  36:      pop ax
  37:      ret
  38:  start:
  39:      mov ax, data
  40:      mov ds, ax
  41:      
  42:      mov ax, stack
  43:      mov ss, ax
  44:      mov sp, 160
  45:      
  46:      ; 改变DTA表的位置
  47:      mov ah, 1ah
  48:      lea dx, DTA
  49:      int 21h
  50:      
  51:      ; 查找第一个文件
  52:      mov ah, 4eh
  53:      lea dx, sname
  54:      xor cx, cx
  55:      int 21h
  56:      
  57:      jc ext
  58:   
  59:      ;打印查找到的第一个文件
  60:      lea bx, DTA
  61:      add bx, 1eh
  62:      call print
  63:      
  64:      ;打印换行
  65:      mov dl, 0ah
  66:      call printChar
  67:      
  68:  main_001:
  69:      mov ah, 4fh
  70:      int 21h
  71:      jc ext
  72:      call print
  73:      
  74:      ;打印换行
  75:      mov dl, 0ah
  76:      call printChar
  77:      
  78:      jmp main_001
  79:  ext:
  80:      mov ax, 4c00h
  81:      int 21h
  82:  code ends
  83:  end start
(9)、功能4FH


功能描述:在中断21H的功能4EH成功使用之后,再搜索下一个文件名
入口参数:AH=4FH
AL=返回的代码
出口参数:CF=1——操作失败,AX=错误号(12H),其含义见错误代码表,否则,操作成功,DTA中的数据如前面功能4EH所示

例程:
请参看 (8)、功能4EH

(10)、功能56H


功能描述:文件换名
入口参数:AH=56H
DS:DX=当前文件名字符串地址
ES:DI=新文件名字符串地址
出口参数:CF=0——操作成功,否则,AX=错误号(02H、03H、05H、11H),其含义见错误代码表

例程:
   1:  assume cs:code
   2:   
   3:  data segment
   4:      oldname db 'c:/123.txt', 0
   5:      newname db 'c:/1.txt', 0
   6:      suc db 'rename to 1.txt success!$', 0
   7:      fail db 'rename to 1.txt fail!$', 0
   8:  data ends
   9:   
  10:  code segment
  11:  start:
  12:      mov ax, data
  13:      mov ds, ax
  14:      mov es, ax
  15:      
  16:      mov ah, 56h
  17:      lea dx, oldname
  18:      lea di, newname
  19:      int 21h
  20:      jc main_02
  21:      mov ah, 09h
  22:      lea dx, suc
  23:      int 21h
  24:      jmp ext
  25:  main_02:
  26:      mov ah, 09h
  27:      lea dx, fail
  28:      int 21h
  29:  ext:
  30:      mov ax, 4c00h
  31:      int 21h
  32:  code ends
  33:  end start
(11)、功能57H


功能描述:读取/设置文件的日期和时间
入口参数:AH=57H
BX=文件句柄 读取日期和时间AL=00H
设置日期和时间AL=01H
CX=时间(0F~0BH:小时,0AH~05H:分钟,04H~00H:2秒的个数)
DX=日期(0F~09H:年(相对1980年),08H~05H:月,04H~00H:日)
出口参数:CF=1——操作失败,AX=错误号(01H、06H),其含义见错误代码表,否则,若是读文件信息,则,CX=时间,DX=日期

(12)、功能5AH


功能描述:创建临时文件
入口参数:

AH=5AH
DS:DX=路径名的地址
CX=文件属性(位可组合),其定义如下: 位0=1 只读位3-4=0  保留
位1=1 隐含位5=1  归档
位2=1 系统位6-15=0 保留
出口参数:CF=0——操作成功,AX=文件句柄,DS:DX=完整的路径文件地址,否则,AX=错误号(03H、04H或05H),其含义见错误代码表

例程:

   1:  assume cs:code
   2:   
   3:  data segment
   4:      temppath db 'c:/', 0
   5:      fail db 'create temp file fail!$', 0
   6:      
   7:  data ends
   8:   
   9:  code segment
  10:  ; 入口参数dl
  11:  printChar:
  12:      mov ah, 02h
  13:      int 21h
  14:      ret
  15:      
  16:  ; 入口参数dx
  17:  print:
  18:      push ax
  19:      push si
  20:      push bx
  21:      xor si, si
  22:      
  23:  local_001:
  24:      cmp byte ptr ds:[bx + si], 0
  25:      jz local_002
  26:      mov dl, ds:[bx + si]
  27:      call printChar
  28:      inc si
  29:      jmp local_001
  30:  local_002:
  31:      pop bx
  32:      pop si
  33:      pop ax
  34:      ret
  35:  start:
  36:      mov ax, data
  37:      mov ds, ax
  38:      
  39:      mov ah, 5ah
  40:      lea dx, temppath
  41:      xor cx, cx
  42:      int 21h
  43:      
  44:      jc main_02
  45:      call print
  46:      
  47:      jmp ext
  48:  main_02:
  49:      mov ah, 09h
  50:      lea dx, fail
  51:      int 21h
  52:      
  53:  ext:
  54:      mov ax, 4c00h
  55:      int 21h
  56:  code ends
  57:  end start
(13)、功能5BH

 

功能描述:创建新文件
入口参数:AH=5BH
DS:DX=路径名的地址
CX=文件属性(位可组合),其定义如下: 位0=1只读位4=0保留
位1=1隐含位5=1归档
位2=1系统位6-15=0保留
位3=1卷标号
出口参数:CF=0——操作成功,AX=文件句柄,否则,AX=错误号(03H、04H、05H或50H),其含义见错误代码表

(14)、功能67H


功能描述:设置文件句柄数(最多文件数)
入口参数:AH=67H
BX=句柄的数量
出口参数:CF=0——操作成功,否则,AX=错误号,其含义见错误代码表

(15)、功能6CH


功能描述:扩展的打开文件功能(打开、创建或替换文件)
入口参数:AH=6CH
AL=00H
DS:SI=路径名的地址
BX=打开方式 位2~0000—只读  001—只写  010—可读、写
位3保留(0)
位6~4000—兼容   001—拒绝读写  010——拒绝写
011—拒绝读  100——不拒绝任何操作
位70—子进程继承句柄,1—子进程不继承句柄
位12~8保留(0)
位13致命错误处理程序,0—执行INT 24H,否则,返回错误代码给进程
位14写入方式:0—写入缓冲区,1—直接写入文件
位15保留(0)
CX=文件属性
位0=1 只读位4=0   保留
位1=1 隐含位5=1   归档
位2=1 系统位6-15=0 保留
位3=1 卷标签
DX=打开标志 位3~0 0—打开失败,1—打开文件,2—替换文件
位7~4 0—打开失败,1—创建文件
位15~8 0—保留
出口参数:CF=1——操作失败,AX=错误号,其含义见错误代码表,否则,
AX=文件句柄
CX=1——文件存在,打开之
 =2——文件不存在,创建之

posted @ 2013-07-28 14:04  Ares_  阅读(796)  评论(0编辑  收藏  举报