2013-06-24 78 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