用汇编来对bmp文件进行修改

文件操作是编程中经常要用到的功能,读取运行参数、保存运行结果等等都需要用到文件操作。

  在大多数编程语言中文件操作都是很容易实现的,因为它们都附带了相关的函数库,但在汇编语言中没有这样的库,因此就只有自己动手来做了。

  在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 Segment
Assume CS:Code
Start:
Mov AX,CS
Mov DS,AX
Mov AX,3c00H
Mov CX,20H ;文件属性为归档
Mov DX,Offset FileName
Int 21H ;建立文件
Jc Err1
Mov BX,AX
Mov AX,3e00H
Int 21H ;关闭文件
Mov AX,3d02H
Mov DX,Offset FileName
Int 21H ;按读写方式打开文件
Jc Err2
Mov BX,AX
Mov AX,4000H
Mov CX,14 ;要写的字节数
Mov DX,Offset Msg
Int 21H ;写数据到文件
Jc Err3
Mov AX,3e00H
Int 21H ;关闭文件
Exit:
Mov AX,4c00H
Int 21H
Err1:
Mov DX,Offset Error1
Jmp ShowErr
Err2:
Mov DX,Offset Error2
Jmp ShowErr
Err3:
Mov DX,Offset Error3
Jmp ShowErr
ShowErr:
Mov AX,900H
Int 21H
Jmp Exit
Error1 DB "Create file fail.",13,10,"$"
Error2 DB "Open file fail.",13,10,"$"
Error3 DB "Write file fail.",13,10,"$"
FileName DB "Data.txt",0
Msg DB "Hello World!",13,10
Code Ends
End Start
 

  最后要注意的一点是:在对文件写操作完毕之后记得要关闭文件才能使用系统将数据刷新到磁盘上,否则写进去的东西很可能会丢失。



UltraEdit 可以用二进制形式观察bmp文件。。 可以易于观察

自己的代码
data segment
aa db "33.bmp",0
bb db "44.bmp",0
topfile db 36h dup ('?')
file db 0f1e6h-36h+1 dup ('f') ;可改信息
data ends



code segment
assume ds:data,cs:code
start:
mov ax,data ;打开文件
mov ds,ax

mov ah,3dh
mov al,2h
mov dx,offset aa
int 21h
jc shibai ;打开了

mov bx,ax ;读文件
mov ah,3fh
mov cx,36h
mov dx,offset topfile
int 21h
jc shibai ;读头文件

; mov ah,10h ;改高度和宽度
;mov byte ptr ds:[[topfile+12h]],ah
;mov byte ptr ds:[[topfile+16h]],ah

mov ah,3eh ;关源文件
int 21h

mov ah,3ch ;新建文件
mov cx,20h
mov dx,offset bb
int 21h
jc shibai


mov bx,ax ;写文件
mov ah,40h
mov cx,01e6h ;导入文件字节大小
mov dx,offset topfile
int 21h

mov ah,3eh ;关新建的文件
int 21h


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值