该程序必须简单地从文件中读取文本并输出。问题是文件名是由用户输入的。
到目前为止我做了什么:
我得到了什么:
无法打开文件
.model small
.stack 100h
.data
filename db 255 dup(0)
line db 255 dup(0)
filehandle dw ?
line_len dw ?
.code
newline macro ;NEW LINE
;
mov dl, 10 ;
mov ah, 02h ;
;
int 21h ;
;
mov dl, 13 ;
mov ah, 02h ;
;
int 21h ;
endm ;NEW LINE
main:
mov ax, @data
mov ds, ax
lea si, filename
mov ah, 01h
char_input:
int 21h
cmp al, 0dh
je zero_terminator
mov [si], al
inc si
jmp char_input
zero_terminator:
mov [si], '\0'
int 21h
open_file:
lea dx, filename
mov al, 0
mov ah, 3Dh
int 21h
mov filehandle, ax
int 21h
read_line:
mov ah, 3Fh
lea bx, filehandle
mov cx, 1
int 21h
cmp ax, 0 ;EOF
je EO_file
inc line_len
jmp read_line:
EO_file:
newline ;macro
lea dx, line ;print line
mov bx, 1
mov ah, 40h
mov cx, line_len
int 21h
mov ah, 4ch
int 21h
end main
答案 0 :(得分:2)
总结Jester的评论并添加一些评论,以下是您的计划存在的问题:
zero_terminator:
mov [si], '\0'
int 21h
应删除此int 21h
指令。使用'\ 0'不会使文件名终止。更好地使用普通的 0 。
mov filehandle, ax
int 21h
read_line:
此int 21h
指令也应删除。
read_line:
mov ah, 3Fh
lea bx, filehandle
mov cx, 1
int 21h
在这个读取块中,您忘记在DX中设置缓冲区地址,并且您错误地在BX中移动了文件句柄变量的地址,而实际上您需要其值。 另请注意,缓冲区地址需要在此循环的每次迭代时递增!更改为:
lea dx, line
read_line:
mov ah, 3Fh
mov bx, filehandle
mov cx, 1
int 21h
;;; jc EO_file ??
cmp ax, 0 ;EOF
je EO_file
inc line_len
inc dx
jmp read_line ; <-- Here you had a typo!
打开文件后检查CF以确认你确实有一个有效的句柄会很棒。