`
qdujunjie
  • 浏览: 108709 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

汇编语言写文件读文件代码分析(18)

阅读更多

 

 

 

内容来自于《Intel汇编语言程序设计》(第四版)第11章--------32位Windows编程。

 

我们的整个顺序应该是,首先将内容写入文件(如果没有文件,将会创建新文件),然后将内容从文件中读出。

 

首先来看一下将数据写入文件:

 

 

TITLE Using WriteFile                  ( WriteFile.asm )

 

INCLUDE Irvine32.inc

 

.data

buffer BYTE "This text is written to an output file.",0dh,0ah

bufSize = ( $ - buffer)

errMsg BYTE "Cannot create file",0dh,0ah,0

filename BYTE "output.txt",0

fileHandle DWORD ?                      ; handle to output file

bytesWritten DWORD ?                 ; number of bytes written

 

.code

main PROC

         INVOKE CreateFile,

         ADDR filename , GENERIC_WRITE , DO_NOT_SHARE , NULL ,

         CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0

         mov fileHandle , eax                  ; save file handle

         .IF eax == INVALID_HANDLE_VALUE

             mov edx,OFFSET errMsg        ; display error message

             call WriteString

             jmp QuitNow

         .ENDIF

 

         INVOKE WriteFile,                      ; write text to file

             fileHandle,                              ; file handle

             ADDR buffer,                           ; buffer pointer

             bufsize,                                   ; number of bytes to write

             ADDR bytesWritten,                ; number of bytes written

             0                                             ; overlapped execution flag

 

         INVOKE CloseHandle , fileHandle

QuitNow:

         INVOKE ExitProcess,0                 ; end program

main ENDP

END main

 

 

 程序首先使用CreateFile函数打开一个文件:

 

         INVOKE CreateFile,

         ADDR filename , GENERIC_WRITE , DO_NOT_SHARE , NULL ,

         CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , 0

 

因为这里使用了 CREATE_ALWAYS 标志,所以现存的文件将被覆盖。

 

后面的代码:

 

         mov fileHandle , eax                  ; save file handle

         .IF eax == INVALID_HANDLE_VALUE

             mov edx,OFFSET errMsg        ; display error message

             call WriteString

             jmp QuitNow

         .ENDIF

 

首先将句柄保存到fileHandle 中,然后会判断文件打开是否成功,如果未成功,则会输出一条错误语句之后跳转到QuitNow退出。 

 

如果得到句柄,则程序会使用WriteFile将字符串写入文件:

 

         INVOKE WriteFile,                      ; write text to file

             fileHandle,                              ; 前面得到的句柄值

             ADDR buffer,                           ; 要输入的字符串的首地址

             bufsize,                                   ; 将要写入的数据的长度

             ADDR bytesWritten,                ; 函数执行完成之后实际写入的数据的byte数,bytesWritten就是返回值

             0                                             ; 异步信息的指针,这个参数是可选的,这里传入0 

 

然后将数据写入文件之后,我们要关闭文件:

 

INVOKE CloseHandle , fileHandle

 

这时我们只需要将我们打开的文件的句柄传入即可。

 

将数据写入文件的代码到这里就结束了。下面来看一下将数据从文件中读取的代码:

 

 

 

TITLE Using ReadFile                          ( ReadFile.asm )

 

INCLUDE Irvine32.inc

 

.data

buffer BYTE 500 DUP(?)

bufSize = ( $ - buffer )

errMsg BYTE "Cannot open file",0dh,0ah,0

filename BYTE "output.txt",0

fileHandle DWORD ?                   ; handle to output file

byteCount DWORD ?                  ; number of bytes written

.code

main PROC

        INVOKE CreateFile,             ; open file for input

        ADDR filename , GENERIC_READ,

        DO_NOT_SHARE , NULL , OPEN_EXISTING ,

        FILE_ATTRIBUTE_NORMAL , 0

 

mov fileHandle , eax                    ; save file handle

.IF eax== INVALID_HANDLE_VALUE

   mov edx,OFFSET errMsg           ; display error message

   call WriteString                        

   jmp QuitNow

.ENDIF

 

INVOKE ReadFile,                         ; read file into buffer

             fileHandle , ADDR buffer ,

             bufSize , ADDR byteCount , 0

 

INVOKE CloseHandle,                   ; close the file

             fileHandle

 

mov esi , byteCount                      ; insert null terminator

mov buffer[esi] , 0                         ; into buffer

mov edx,OFFSET buffer                 ; display the buffer

call WriteString

 

QuitNow:

INVOKE ExitProcess , 0                  ; end program

main ENDP

END main

 

 

程序首先仍然使用CreateFile打开将要读取数据的文件,这里使用了OPEN_EXISTING 参数。之后同样把eax中的句柄保存到变量中。然后调用ReadFile函数,将句柄参数传入,然后将数据读取到缓冲区buffer中,之后将文件句柄关闭。

 

之后的程序如下:

 

mov esi , byteCount                      ; 首先将调用ReadFile返回的字节数byteCount赋值到esi中

mov buffer[esi] , 0                         ; 这样就取到了buffer的最后一个元素的地址,因为是字符串的结束,所以将0赋给最后一个元素。

mov edx,OFFSET buffer                 ; 将buffer的偏移地址赋值到edx中

call WriteString                              ; 打印出buffer缓冲区中的数据内容

 

 

读取文件代码结束。

分享到:
评论

相关推荐

    汇编语言写的PE文件的代码插入.zip

    汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - *...

    24小时掌握8086汇编语言

    汇编语言”作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM, TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象...

    汇编课程设计文件管理系统代码加文档

    本设计时应用汇编语言编辑文件管理系统,对当前目录下的文件属性管理,如文件的创建、文件的删除、在文件中输入内容、阅读一个文件里的内容、更改文件名等。并对程序的界面做进一步的设计。 在Dos界面下,输入命令。...

    文件操作的实现——汇编语言

    汇编语言课程设计文件操作的实现的题目!任务!源代码!

    汇编语言完成文件的读写操作

    汇编语言可以用于完成文件的读写操作。下面是一个简单的示例汇编代码,演示如何使用汇编语言完成文件的读写操作。这个示例使用了Linux系统的系统调用来实现文件的读写操作。

    汇编语言小汽车移动代码含执行文件

    这是用汇编语言写的小汽车在屏幕上运行的代码,这是我的课程设计,有需要的朋友可以去下载看看!

    Linux中的汇编语言

    在阅读Linux源代码时,你可能碰到一些汇编语言片段,有些汇编语言出现在以.S为扩展名的汇编文件中,在这种文件中,整个程序全部由汇编语言组成。有些汇编命令出现在以.c为扩展名的C文件中,在这种文件中,既有C语言...

    汇编语言 简单27个案例

    27个汇编简单例子..有可以执行的.exe文件和.asm 的代码文件

    汇编语言程序(源代码和运行效果文件,27个实例)

    大量的汇编语言演示实例 包括27个完整的演示实例 内含源代码 实在是学习汇编语言编程的良好参考资料

    x86汇编语言 从实模式到保护模式.zip

    x86汇编语言 从实模式到保护模式,

    汇编语言编写的Windows记事本程序源代码.rar

    采用汇编语言编写的Windows记事本程序源代码,模拟XP自带记事本,未实现打印功能,拖放文件功能,基本实现所有功能,添加了工具栏和状态栏,增加颜色功能,学习罗云彬《windows环境下32位汇编语言程序设计》一个月记。...

    汇编实现文件加密解密

    利用汇编语言编写的文件加密解密程序,有详细解释说明、源代码

    汇编语言文本编辑器

    汇编 文本编辑器 打开,保存,关闭,help

    汇编语言实例--案例7代码转换程序

    这是一个字母或数制之间的转化程序,5为主模块,调用模块1和模块7 模块1又调用模块2、3、4和6四个模块,其中: ...使用时,需将7个文件分别汇编,连接的方法为: 5+1+2+3+4+6+7 生成可执行文件“5” 即可运行。

    51单片机:波特率计算器+定时器计算+串口调试助手+HEX文件转汇编语言文件

    可能部分程序杀毒软件误报,原因我也不清楚,但保证无毒。 将HEX文件用记事本打开,然后把代码复制到...如果想练习汇编语言写单片机,但是又不够熟练,不妨用C语言写好将HEX文件转换成汇编语言代码然后来参考学习。

    asm 汇编语言基础知识

    汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以...

    Windows环境下32位汇编语言程序设计_随书光盘

    × 《Windows环境下32位汇编语言程序设计》 × × 附书代码说明 × ××××××××××××××××××××××××××× 1. 编译器和链接器 本附书代码全部采用 MASM 格式编写,推荐使用 MASM32 软 件包作为...

    汇编语言_王爽(清晰)卷2

     1.2 汇编语言的产生   1.3 汇编语言的组成   1.4 存储器   1.5 指令和数据   1.6 存储单元   1.7 CPU对存储器的读写   1.8 地址总线   1.9 数据总线   1.10 控制总线   1.11 内存地址...

    完整详细的汇编语言实验报告

    3、掌握汇编语言程序从设计到形成可执行程序文件的方法和步骤。 4、了解汇编语言的系统工作文件和工作环境。理解汇编程序和连接程序的作用。理解列表文件内容。 5、初步了解程序的运行和调试方法。学会使用Debug主要...

    计算机汇编语言教案

    汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言”作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。

Global site tag (gtag.js) - Google Analytics