汇编语言的文件读取

  • Post author:
  • Post category:其他


;****************************************************
;程序功能:读取文本文件
;          首先根据文件指针移动获取文件大小,
;          动态申请内存,最后读取文件内容写入
;          缓冲区
;****************************************************

;****************************************************
;程序平台说明:
.MODEL SMALL,STDCALL
OPTION CASEMAP:NONE
;****************************************************


;****************************************************
;数据段定义
.DATA

strFileName byte "D:\2.txt",0
strOpenFailed byte "the file open failed",0
strOpenFailedSize word $-strOpenFailed
FileHandle  word ?
FileHi word ?
FileLo word ?
strBufferSize word ?
strBuffer word ?

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

;****************************************************
;代码段定义
.CODE
main proc
  ;装载数据段地址
  mov ax,@data
  mov ds,ax
  ;打开文件
  mov ax,716ch
  mov bx,0;只读模式
  mov cx,0;普通属性
  mov dx,1;打开文件
  mov si,offset strFileName  
  int 21h
  jc OpenFailed;
  mov FileHandle,ax
  ;开始获取文件大小
  ;将文件指针移动到文件起始处
  mov ah,42h
  mov bx,FileHandle
  mov al,0;从文件起始处开始计算
  mov cx,0
  mov dx,0
  int 21h
  mov FileHi,dx
  mov FileLo,ax
  ;将文件指针移动到文件的末尾处,计算偏移量
  mov ah,42h
  mov bx,FileHandle
  mov al,2
  mov cx,0
  mov dx,0
  int 21h
  ;计算偏移量,获得文件大小
  sub dx,FileHi
  mov FileHi,dx
  sub ax,FileLo
  mov FileLo,ax
  mov strBufferSize,ax
  ;暂时抹去高位
  ;动态申请内存
  mov ah,48h
  mov bx,strBufferSize  
  int 21h
  mov strBuffer,ax  
  ;将文件指针移动到文件起始处,开始读取内容
  mov ah,42h
  mov bx,FileHandle
  mov cx,0
  mov dx,0
  mov al,0
  int 21h
  ;开始读取文件内容
  mov ah,3fh
  mov bx,FileHandle
  mov dx,offset strBuffer
  mov cx,strBufferSize
  int 21h
  ;显示内容有问题  
  mov ah,40h
  mov bx,1
  mov dx, offset strBuffer
  mov cx,strBufferSize
  
  int 21h
  
  ;关闭文件
  mov ah,3eh
  mov bx,FileHandle
  int 21h
  jmp exit
OpenFailed:
  mov ah,40h
  mov bx,1
  mov dx,offset strOpenFailed
  mov cx,strOpenFailedSize
  int 21h
  jmp exit;
exit:
  mov ah,4ch
  int 21h
main endp
end main
;****************************************************

PS:

在汇编语言当中需要注意的是,当在打开,读取文件等操作时,是否成功的标志是放在cf当中的,于是乎就有了,一系列的JC

另外,我需要注意的就是读取文件时,需要自行移动文件指针,不会像高级语言那样会自动帮你移动文件指针,还有一点就是当你在使用缓冲区的时候,需要注意的就是,当缓

冲区使用完毕之后注意,清空缓冲区,否则在使用的时候会产生影响。一般是在最后一个结果当中@!!

还有就是这里面需要注意的就是,申请的内存地址是放在strBuffer中的,但是在使用时,需要注意的是要

mov dx,offset strBuffer;将文件内容读取到strBuffer指向的内存

mov dx,offset strBuffer;将内容输出到bx=1的控制台上



版权声明:本文为dasgk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。