`
qdujunjie
  • 浏览: 110345 次
  • 性别: 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缓冲区中的数据内容

 

 

读取文件代码结束。

分享到:
评论

相关推荐

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

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

    汇编语言对文件简易加密解密

    【汇编语言对文件简易加密解密】 在计算机科学领域,加密和解密是信息安全的重要组成部分,用于保护数据的隐私和安全。本项目探讨的是如何使用汇编语言实现对文件的简单加密和解密功能。汇编语言是一种低级编程语言...

    汇编语言实例--案例22磁盘文件的读写

    本案例"案例22磁盘文件的读写"着重讲解如何使用汇编语言对磁盘上的文件进行读取和写入操作。 磁盘文件的读写是计算机系统中的基本操作,涉及到I/O(输入/输出)和文件系统。在汇编语言中,这一过程通常涉及以下步骤...

    汇编语言全接触压缩文件

    压缩文件中的“汇编语言全接触.chm”很可能是一个包含完整书内容的CHM(Compiled Help Manual)格式文档,这是一种Windows系统的帮助文件格式,用户可以通过它来方便地查阅和学习书中的各种知识。 学习汇编语言不仅...

    王爽汇编语言源码

    "王爽汇编语言源码"中的每个文件都是精心设计的教学实例,涵盖了一些基本的汇编指令,如数据传送、算术运算、逻辑运算、流程控制等,还包括了内存管理、输入输出操作等高级主题。 在学习这些源码时,你可以从以下几...

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

    课程设计中提供的源代码可能包含上述各种操作的示例,通过阅读和分析这些代码,可以加深对汇编语言文件操作的理解。同时,通过调试和修改代码,可以进一步掌握实际应用技巧。 总结,这个汇编语言课程设计旨在让学生...

    汇编语言写的几个游戏

    汇编语言写的程序是通过符号化的指令来表示机器代码,使得程序员能够更容易理解和编写复杂的程序。标题提到的是"汇编语言写的几个游戏",这意味着我们将会探讨如何使用汇编语言来创建游戏。 汇编语言的游戏开发涉及...

    汇编写的超级玛丽(附带源码)

    本篇将深入探讨一个使用汇编语言编写的超级玛丽游戏,让我们一同揭秘这款简陋但有趣的经典游戏在底层代码中的实现细节。 首先,我们看到的文件名"**Mario.Asm**"是汇编源代码文件,它是整个游戏的核心部分。汇编...

    Intel汇编语言程序设计库文件

    《Intel汇编语言程序设计》是一本深入探讨Intel架构下汇编语言编程的权威书籍,其库文件和引入文件是学习和实践汇编语言编程的重要资源。这些文件主要用于支持和简化编写汇编语言程序的过程,使得程序员能够更高效地...

    汇编语言文本编辑器

    【汇编语言文本编辑器】是一种专为编程者设计的工具,主要用于编写和编辑汇编语言源代码。汇编语言是计算机程序设计的一种低级语言,它的指令与计算机硬件的指令集紧密相关,程序员需要通过它来直接控制硬件操作。...

    Windows环境下32位汇编语言程序设计源码

    汇编语言是与机器语言对应的、更易读的编程语言,每条指令都直接对应于计算机硬件的特定操作。32位汇编语言提供了丰富的指令集,包括数据处理、控制流程、输入输出等,使得开发者可以直接操纵硬件资源。 在Windows...

    汇编语言写的3D图形程序.rar

    虽然高级语言如C++或Python提供了更抽象、更易读的语法,但汇编语言因其对硬件的直接控制能力而在某些特定场景下,尤其是对性能有极高要求的3D图形编程中,依然有着不可替代的地位。这篇内容将深入探讨一个由汇编...

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

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

    (汇编语言)(文件操作)(电话本)

    在“(汇编语言)(文件操作)(电话本)”这个主题中,我们将探讨如何使用汇编语言来实现电话本的基本功能,如姓名和电话的录入、查找及查看。 1. **汇编语言基础**: 汇编语言是用助记符表示机器码的语言,比如...

    汇编语言写的改编打字游戏

    【汇编语言编程基础】 汇编语言是一种低级编程语言,它是计算机硬件可以直接理解的语言,每条指令对应一个或几个机器码。...通过分析源码和运行.exe文件,我们可以深入学习到汇编语言编程的诸多细节。

    24小时掌握8086汇编语言

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

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

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

    文本编辑器(汇编语言)

    在文件名“汇编语言(文本编辑器)”中,我们可以推测这是一个包含汇编语言源代码的文件集合。可能包含多个模块,如主程序、键盘处理子程序、屏幕输出子程序等。这些文件通常会有各自的函数定义和调用关系,通过分析...

    Intel 汇编语言程序设计第五版源码

    《Intel 汇编语言程序设计第五版源码》是一份深入学习Intel汇编语言的重要资源,对于想要掌握计算机底层工作原理、优化代码性能或进行系统级编程的开发者来说,具有极高的价值。该资源包含了丰富的源码示例,帮助...

    汇编语言link masm 文件

    MASM(Microsoft Assembler)是微软提供的一种汇编器,用于将汇编语言源代码转换成机器可执行的二进制代码。而LINK是微软的链接器,它的作用是将汇编器生成的.obj文件与其他库文件合并,形成最终的可执行程序或动态...

Global site tag (gtag.js) - Google Analytics