Julienn
Julienn

Reputation: 189

TASM assembly language Write to File function 40H writes the wrong characters?

This is just a practice code I need to learn in file handling. I need to read a file, and copy its contents to another created file, then on that file I need to append a certain signature.

First my Source Code:

.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

It reads a file with this content:

hello

Then it outputs (creates another file) with this content

hello (spaces) ഊ䥎佃䅌⁓䅗⁓䕈䕒

My question is, why does it append chinese characters? The bytes I need to append is the data 'sign' in the .data.

Thanks in advance!

Upvotes: 1

Views: 2564

Answers (1)

hobbs
hobbs

Reputation: 239672

You're writing 100 bytes to the file. You didn't read 100 bytes to begin with because the input file is shorter than that, so you're writing garbage data beyond the end of what was read. int 21 function 3f returns the number of bytes actually read in AX; you should only write that many bytes, instead of a fixed 100.

Upvotes: 1

Related Questions