我不知道这里的问题在哪里,我正在尝试将所有字符从文件输出到屏幕,但不知何故它只打印最后一个。 例如,如果我的test.txt文件中包含 abc 行,则输出仅向我们显示 c 。 在这种情况下我应该如何正确使用lodsb? 不要介意数据部分中的一些不必要的行,我只是粘贴了所有代码。
更新代码:
.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
答案 0 :(得分:2)
close_1_file:
mov bx, handle
mov ah, 3eh
int 21h
loop:
lodsb
mov dl,al
call charget
cmp si, 0
jmp ending
jmp loop
首先,你真的不应该把一个标签命名为指令。
其次,si
在哪里初始化?
第三,为什么要将它与0进行比较?
第四,为什么两次跳?
jmp ending ; you want this to be je
jmp loop
函数charget
写一个字符,但是它被命名为好像在读它?
但即使你有je
分支,0
来自哪里?你在文件中说abc
,所以缓冲区中没有0
,除非你把它放在那里。
<强>更新强>
您必须做的是以下内容:
更新2
你还有一个问题。当然,您将每个字符存储在一行中,否则您将在同一位置读取每个字符。
mov ax, counter
mov dx, offset buffer
add dx, ax
inc counter