汇编语言

C语言的读取文件函数是fopen
那么汇编语言的读取文件的指令是什么?
又如何使用呢?效果又有哪些?
为了这个问题,我不惜降级。

在win32汇编中读取文件使用的函数是CreateFile函数.
不管是打开文件还是创建文件都用CreateFile函数.
它的用法是:
invoke
CreateFile,lpFileName,dwDesiredAccess,
dwShareMode,lpSecurityAttributes,dwCreatio
nDisposition,dwFlagsAndAttributes,hTemplateFile

CreateFile函数的参数又多又复杂,下面是各参数的含义:

1)lpFileName指向存放有文件名的缓冲区,文件名是一个以0结尾的字符串。CreateFile函数可以打开多种对象,包括:

控制台——Windows中类似与MS-DOS方式的界面窗口。
通信设备——包括串口等设备。
目录和文件
邮件槽
管道

CreateFile函数以不同格式的文件名来区分操作对象,普通的“驱动器:\路径\文件名”之类的格式指的就是普通的文件;

2)dwDesiredAccess参数是存取方式,通过这个参数可以指定要对打开的文件进行何种操作,指定GENERIC_READ标志表示需要读取文件数据,指定GENERIC_WRITE标志表示需要向文件写数据,如果要对一个文件进行读写,需要同时指定两个标志。
3)dwShareMode参数是共享属性,表明文件被打开后是否允许其他进程以某种方式再次打开文件,它可以是一些取值的组合:
0——不允许文件被再次打开。
FILE_SHARE_DELETE——允许其他进程同时对文件进行删除。
FILE_SHARE_READ——允许其他进程同时以读方式打开文件。
FILE_SHAR_WRITE——允许其他进程同时以写方式打开文件。

4)lpSecurityAttributes参数为安全属性,通过这个参数可以指定返回的文件句柄是否可以被子进程继承,如果参数设置为NULL,则表明无法继承,否则需要将参数指向一个SECURITY_ATTRIBUTES结构,该结构定义为:
SECURITY_ATTRIBUTES STRUCT
nLength DWORD ?
lpSecurityDescriptor DWORD ?
bInheritHandle DWORD ?
SECURITY_ATTRIBUTES ENDS
nLength字段需要设置为结构的长度,将bInheritHandle字段设置为TRUE就可以使句柄能够被字进程继承。

5)dwCreationDisposition参数用来设置文件已经存在或不存在时系统采取的动作,在这里指定不同的标志就可以决定函数执行的功能究竟是创建文件还是打开文件,参数可能的取值为:
CREATE_NEW——创建新文件,如果文件已经存在函数会返回失败。
CREATE_ALWAYS——创建新文件,如果文件已经存在则清除原文件。
OPEN_EXISTING——打开存在的文件,当文件不存在时函数会返回失败。
OPEN_ALWAYS——如果文件已经存在,则打开,不存在则创建新文件。
TRUNCATE_EXISTING——打开文件并将文件截断为零,当文件不存在时返回失败。

6)dwFlagsAndAttributes参数用来指定新建文件的属性,文件属性可以是下面这些取值的组合:
FILE_ATTRIBUTE_NORMAL——普通文件,设置这个属性时其他属性都不会生效。
FILE_ATTRIBUTE_ARCHIVE——设置归档属性。
FILE_ATTRIBUTE_HIDDEN——设置隐藏属性。
FILE_ATTRIBUTE_READONLY——设置只读属性。
FILE_ATTRIBUTE_SYSTEM——设置系统属性。
FILE_ATTRIBUTE_TEMPORARY——临时文件,系统会尽量把所有的文件内容保持在内存中以加快存取速度,程序在不再使用文件的时候需尽快将它删除。

此外该参数还可同时指定对文件操作的方式,常用的有:
FILE_FLAG_WRITE_THROUGH——使用WriteThrough模式,系统不会对文件使用缓存,文件的改变马上会被写入到磁盘中。
FILE_FLAG_OVERLAPPED——使用异步文件操作方式。
FILE_FLAG_DELETE_ON_CLOSE——文件被关闭立即被系统自动删除。
FILE_FLAG_RANDOM_ACCESS——对文件进行随机读写操作(操作系统对该文件的缓存进行优化)

7)hTemplateFile参数指定了一个文件模版的句柄,该文件模版的所有属性都会被复制到当前创建的文件中。Windows95不支持本参数,为了保持程序的兼容性,建议再参数中使用NULL。

;********************************************************************
; 打开文件
;********************************************************************
invoke CreateFile,addr szFileName,GENERIC_READ,FILE_SHARE_READ,0,\
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax == INVALID_HANDLE_VALUE
invoke MessageBox,hWinMain,addr szErrOpenFile,NULL,MB_OK or MB_ICONEXCLAMATION
ret
.endif
mov @hFile,eax
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-07-20
我这里有个汇编语言读取文件的例子,你看看。希望对你有帮助:
EnumDir PROC DirName : DWORD , FileType:DWORD

LOCAL hSearch : DWORD
LOCAL DirorFile[MAX_PATH] : DWORD

pushad
push DirName
lea esi,DirorFile
push esi
mov eax , 12345678h
_lstrcpy = dword ptr $-4
call eax

@pushsz '\*.*'
push esi ;DirorFile
call _lstrcat[ebx]

lea edi,[offset wfd+ebx]
push edi
push esi
mov eax , 12345678h
_FindFirstFile = dword ptr $-4
call eax
cmp eax,INVALID_HANDLE_VALUE
jz ED_Exit
mov hSearch,eax

.REPEAT
.if byte ptr [wfd+44+ebx]=='.'
jmp short EN_NEXT
.endif

push DirName
push esi
call _lstrcpy[ebx]

@pushsz '\'
push esi
call _lstrcat[ebx]

lea eax,[wfd+44+ebx]
push eax
push esi ;DirorFile
call _lstrcat[ebx]

mov eax , dword ptr [wfd+ebx]
and eax , FILE_ATTRIBUTE_DIRECTORY
.if eax ==FILE_ATTRIBUTE_DIRECTORY
push dword ptr FileType
push esi
call EnumDir
.else ;是文件

push dword ptr FileType
push esi
call AnFile
.endif
EN_NEXT:
push edi
push hSearch
mov eax , 12345678h
_FindNextFile = dword ptr $-4
call eax

.UNTIL eax==0 ;FindNexeFile fail

ED_Close:
push hSearch
mov eax , 12345678h
_FindClose = dword ptr $-4
call eax
ED_Exit:
popad
ret 8
EnumDir ENDP

遍历指定目录,寻找指定类型的文件。
输入: DirName : DWORD ,FileType:DWORD
局部变量:LOCAL hSearch : DWORD
LOCAL DirorFile[MAX_PATH] : DWORD
DirName是常量。DirorFile存放中间过程,有时是DirName\*.*、有时是
DirName\FileName或DirName\DirName.
得到一个文件后,判断是否是目录。
是,则递归调用EnumDir,参数是DirorFile。
否,则调用AnFile,分析文件,做相应处理。本回答被提问者采纳
第2个回答  2007-07-20
像fopen这些C语言的函数,其实最终也都是转换为windows api函数的调用的。在汇编里面,看你用的是什么编程环境,想那些win32汇编等都可以直接调用api函数的。如果是没有提供调用方法的,只能通过磁盘中断直接读取扇区数据的方法了。总的来说是和你用的编译器等开发环境有关系的。如果在visual studio里面使用嵌入汇编的话,想fopen ,调用createfile就有同样的作用了,
push 参数
push 参数
push 参数
。。。
call CreateFile

其他的文件函数还有writefile ,readfile 等
第3个回答  2007-07-20
dates segment
buff db 'c:\xiaozi.txt',0 ;文件名
buff1 db 100 dup (?) ;用于保存文件内容的缓冲区,大小自己定
dates ends

codes segment
assume cs:codes,ds:dates
start:
mov ax,dates
mov ds,ax
;打开文件
mov dx,offset buff
mov ah,3dh
int 21h
;读文件
mov bx,ax ;保持文件柄
mov cx,100 ;读字节数
mov dx,offset buff1;缓冲区
mov ah,3fh ;读
int 21h
;
mov ah,4ch
int 21h
codes ends
end start

自己查汇编的书
一般的书应该都有把
第4个回答  2007-07-20
这个要看再什么系统下编程。
dos下可以使用int21 dos系统调用
windows下可以调用win32 API

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网