lodsb tasm仅输出文件中的最后一个字母

时间:2013-12-10 16:42:38

标签: assembly x86 byte buffer tasm

我不知道这里的问题在哪里,我正在尝试将所有字符从文件输出到屏幕,但不知何故它只打印最后一个。 例如,如果我的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   

1 个答案:

答案 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,除非你把它放在那里。

<强>更新

您必须做的是以下内容:

  1. 打开文件。的完成
  2. 读取文件。的完成
  3. 保留您刚读取的字节数。
  4. 关闭文件。的完成
  5. 指向您将其读入的缓冲区。
  6. 循环遍历该缓冲区,直到您打印了N个字符,其中N是您从读取中保留的字节数。
  7. 更新2

    你还有一个问题。当然,您将每个字符存储在一行中,否则您将在同一位置读取每个字符。

    mov ax, counter
    mov dx, offset buffer
    add dx, ax
    inc counter