文件操作是编程中经常要用到的功能,读取运行参数、保存运行结果等等都需要用到文件操作。 在大多数编程语言中文件操作都是很容易实现的,因为它们都附带了相关的函数库,但在汇编语言中没有这样的库,因此就只有自己动手来做了。 在DOS平台下文件读写操作要通过DOS功能调用来做到。DOS功能调用提供了非常丰富的文件操作服务,涵盖了包括文件查找、建立、删除、读写、重定向等大量功能。其他的编程语言的文件访问库函数只不过是对DOS功能调用进行了封装而已。下面我们就来看一下几个常用的文件操作服务的功能及调用参数:AH = 3cH 建立文件入口参数CX = 文件属性DS:DX = 文件名字符串返回值CF = 0 操作成功,此时 AX = 文件句柄CF = 1 操作失败,此时 AX = 错误代码AH = 3dH 打开文件入口参数AL = 0 按只读方式打开1 按只写方式打开2 按读写方式打开DS:DX = 文件名字符串返回值CF = 0 操作成功,此时 AX = 文件句柄CF = 1 操作失败,此时 AX = 错误代码AH = 3eH 关闭文件入口参数BX = 文件句柄返回值无AH = 3fH 读文件入口参数BX = 文件句柄CX = 要读的字节数DS:DX = 存放读入数据的缓冲区返回值CF = 0 操作成功,此时 AX = 成功读入的字节数CF = 1 操作失败,此时 AX = 错误代码AH = 40H 写文件入口参数BX = 文件句柄CX = 要写的字节数DS:DX = 要写的数据返回值CF = 0 操作成功,此时 AX = 成功写入文件的字节数CF = 1 操作失败,此时 AX = 错误代码AH = 42H 移动文件指针入口参数AL = 0 从文件头开始向后移动文件指针1 从文件指针当前位置开始向后移动文件指针2 从文件尾开始向前移动文件指针BX = 文件句柄CX:DX = 文件指针要移动的字节数返回值CF = 0 操作成功,此时 DX:AX = 当前文件指针的位置CF = 1 操作失败,此时 AX = 错误代码 从上面的说明可以看出,文件访问操作只需要按要求设置好参数然后调用指定的调用即可。下面我就给出一个例子来说明文件操作的使用。Code SegmentAssume CS:CodeStart:Mov AX,CSMov DS,AXMov AX,3c00HMov CX,20H ;文件属性为归档Mov DX,Offset FileNameInt 21H ;建立文件Jc Err1Mov BX,AXMov AX,3e00HInt 21H ;关闭文件Mov AX,3d02HMov DX,Offset FileNameInt 21H ;按读写方式打开文件Jc Err2Mov BX,AXMov AX,4000HMov CX,14 ;要写的字节数Mov DX,Offset MsgInt 21H ;写数据到文件Jc Err3Mov AX,3e00HInt 21H ;关闭文件Exit:Mov AX,4c00HInt 21HErr1:Mov DX,Offset Error1Jmp ShowErrErr2:Mov DX,Offset Error2Jmp ShowErrErr3:Mov DX,Offset Error3Jmp ShowErrShowErr:Mov AX,900HInt 21HJmp ExitError1 DB "Create file fail.",13,10,"$"Error2 DB "Open file fail.",13,10,"$"Error3 DB "Write file fail.",13,10,"$"FileName DB "Data.txt",0Msg DB "Hello World!",13,10Code EndsEnd Start 最后要注意的一点是:在对文件写操作完毕之后记得要关闭文件才能使用系统将数据刷新到磁盘上,否则写进去的东西很可能会丢失。UltraEdit 可以用二进制形式观察bmp文件。。 可以易于观察自己的代码data segmentaa db "33.bmp",0bb db "44.bmp",0topfile db 36h dup ('?')file db 0f1e6h-36h+1 dup ('f') ;可改信息data endscode segmentassume ds:data,cs:codestart:mov ax,data ;打开文件mov ds,axmov ah,3dh mov al,2hmov dx,offset aaint 21hjc shibai ;打开了mov bx,ax ;读文件mov ah,3fh mov cx,36hmov dx,offset topfileint 21hjc shibai ;读头文件; mov ah,10h ;改高度和宽度;mov byte ptr ds:[[topfile+12h]],ah;mov byte ptr ds:[[topfile+16h]],ahmov ah,3eh ;关源文件int 21hmov ah,3ch ;新建文件mov cx,20hmov dx,offset bbint 21hjc shibaimov bx,ax ;写文件mov ah,40hmov cx,01e6h ;导入文件字节大小mov dx,offset topfileint 21hmov ah,3eh ;关新建的文件int 21h