2013-06-24 56 views
1

这只是我需要在文件处理中学习的练习代码。我需要读取一个文件,并将其内容复制到另一个创建的文件中,然后在该文件上我需要附加一个特定的签名。TASM汇编语言写入文件功能40H写错字符?

首先我的源代码:

.MODEL SMALL 
.STACK 100H 
.DATA 
FLENME DB 'D:\README.TXT', 0 
FLENMEC DB 'D:\READMECPY.TXT', 0 
BUFFER DW 100 DUP(0) 
HANDLE DW ? 
OERROR DB 'ERROR IN OPENING FILE', 10, 13, '$' 
RERROR DB 'ERROR IN READING FILE', 10, 13, '$' 
CLERROR DB 'ERROR IN CLOSING FILE', 10, 13, '$' 
CRERROR DB 'ERROR IN CREATING FILE', 10, 13, '$' 
WERROR DB 'ERROR IN WRITING FILE', 10, 13, '$' 
FPERROR DB 'ERROR IN MOVING FILE POSITION', 10, 13, '$' 
SIGN DB 10, 13, 'NICOLAS WAS HERE' ;18 BYTES 
.CODE 
BEGIN PROC FAR 
MOV AX, @DATA 
MOV DS, AX 

MOV AX, 3D02H 
LEA DX, FLENME 
INT 21H 
JC OPNER 
MOV HANDLE, AX 
MOV AX, 3F00H 
MOV BX, HANDLE 
MOV CX, 100 
LEA DX, BUFFER 
INT 21H 
JC RDER 
MOV AX, 3E00H 
MOV BX, HANDLE 
INT 21H 
JC CLSER 
MOV AX, 3C00H 
LEA DX, FLENMEC 
INT 21H 
JC CRER 
MOV HANDLE, AX 
MOV AX, 4000H 
MOV BX, HANDLE 
LEA DX, BUFFER 
MOV CX, 100 
INT 21H 
JC WERR 
MOV AX, 4202H 
MOV BX, HANDLE 
MOV CX, 0000H 
MOV DX, 0000H 
INT 21H 
JC FPERR 
MOV AX, 4000H ;This line for writing to file the signature 
MOV BX, HANDLE 
MOV CX, 18 
LEA DX, SIGN 
INT 21H 
JC WERR 
MOV AX, 3E00H 
MOV BX, HANDLE 
INT 21H 
JC CLSER 
JMP EXT 
OPNER: LEA DX, OERROR 
JMP EERRR 
RDER: LEA DX, RERROR 
JMP EERRR 
CLSER: LEA DX, CLERROR 
JMP EERRR 
CRER: LEA DX, CRERROR 
JMP EERRR 
WERR: LEA DX, WERROR 
JMP EERRR 
FPERR: LEA DX, FPERROR 
JMP EERRR 
EERRR: MOV AX, 0900H 
INT 21H 
EXT: MOV AX, 4C00H 
INT 21H 
BEGIN ENDP 
END BEGIN 

它读取这个内容的文件:

你好

然后输出(创建另一个文件)与此内容

你好(空格)30䥎佃䅌⁓䅗⁓䕈䕒

我的问题是,它为什么附加汉字?我需要追加的字节是.data中的数据'符号'。

在此先感谢!

+0

它只是我还是它看起来像你总是从缓冲区复制100个字节到输出文件句柄? –

+0

我知道从文件复制100个字节。然而,还有第二次写入调用只写入了“符号”,它是18个字节。我猜这是中国/垃圾角色造成的。 – Julienn

回答

1

您正在向该文件写入100个字节。您没有读取100个字节,因为输入文件比这个短,所以您正在编写超出所读内容的垃圾数据。 int 21函数3f返回字节数实际上在AX中读取;你应该只写很多字节,而不是固定的100.

+0

但我确实调用了两个写函数,因为第一个函数是复制第一个文件的内容(我先将它固定为100,以便任何内容最多可以复制100个字节(目前)),下一个我把文件位置移到了eof上,并且我调用另一个写函数来追加18字节的签名,我认为这是制作中文字符/垃圾的那个。 – Julienn