I don't know where is the problem here, i'm trying to output all the character from file to the screen, but somehow it prints only the last one. For example if my test.txt file has a line abc in it, the output shows us only c. How should i use lodsb properly in this situation? Don't mind some unnecessary lines in data section, i just pasted not the all code.
Updated code:
.model small
.stack 100h
.data
filename db 'test.txt',0
filename1 db 'temp.txt',0
error_open db 'impossible to open this file$',13,10
error_read db 'impossible to read this file$',13,10
handle dw 0
handle1 dw 0
buffer db 21 dup 0
counter dw 0
.code
mov dx, @data
mov ds, dx
mov dx, offset filename
mov al, 2
mov ah, 3dh
int 21h
mov handle, ax
jc erroropening
readbyte_1_file:
inc counter
mov dx, offset buffer
mov bx, handle
mov cx, 1
mov ah, 3fh
int 21h
jc errorreading
cmp ax, cx
jne close_1_file ;bytes actually read
jmp readbyte_1_file
close_1_file:
mov bx, handle
mov ah, 3eh
int 21h
mov si, offset buffer
put_char:
lodsb
mov dl,al
call putchar
dec counter
cmp counter, 0
je ending
jmp put_char
erroropening:
mov dx, offset error_open
mov ah, 9
int 21h
jmp ending
errorreading:
mov dx, offset error_read
mov ah, 9
int 21h
jmp ending
ending:
mov ax, 4c00h
int 21h
putchar proc
mov ah, 2
int 21h
RET
putchar endp
END
First of all, you really shouldn't name a lable like an instruction.
Second, where is
si
initialized?Third, why do you compare it against 0?
Fourth, why two jumps?
And the function
charget
writes a character, but is named as if it were reading it?But even if you would have the
je
to branch, where would the0
come from? You said in your file isabc
, so there will be no0
in your buffer, unless you explitcitly put it there.update
What you must do is the following:
update 2
You still have one problem left. Of course you store each character in a row, otherwoise you read each single character in the same place.