【发布时间】:2015-11-10 20:52:01
【问题描述】:
好的,我要做的就是从文本中逐行读取然后输出。
我做的事情:
- 读取单个字符,添加到字符串
- 搜索 LF
- 输出字符串
- 从头再来,直到 EOF
问题:
- 不知道如何在它忙于 3Fh 时计算 40h 中断的 cx(尝试创建一些新变量,但最终出现一堆错误)
- 某种奇怪的结果 - 几个空行和最后一个
.txt 示例
some random text
.model small
.stack 100h
.data
filename db 255 dup(0)
text db 255 dup(0)
char db ?
line db 255 dup(0)
filehandle 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 ;read character
char_input:
int 21h
cmp al, 0dh ;enter
je zero_terminator
mov [si], al
inc si
jmp char_input
zero_terminator:
mov [si], 0
open_file:
lea dx, filename
mov al, 0
mov ah, 3Dh ;open file
int 21h
mov filehandle, ax
lea si, text
newline
read_line:
mov ah, 3Fh ;read file
mov bx, filehandle
lea dx, char
mov cx, 1
int 21h
cmp ax, 0 ;EOF
je EO_file
mov al, char
cmp al, 0ah ; line feed
je LF
mov [si], al
inc si
jmp read_line:
EO_file:
lea dx, text
mov ah, 40h ;print
mov cx, 255
mov bx, 1
int 21h
mov ah, 4ch
int 21h
LF:
lea dx, text
mov ah, 40h ;print
mov cx, 255
mov bx, 1
int 21h
inc si
jmp read_line
end main
【问题讨论】:
-
您似乎一次读取一个字符的文本文件。如果您只想在最后一次输出所有行,为什么不进行一次大读取呢?你的代码中没有足够多的 cmets,所以我不知道那些 DOS 系统调用甚至应该做什么。 (因为幸运的是我从来没有为 DOS 编写过代码。)用系统调用的名称来注释系统调用号将是一个好的开始。
-
这不是一个完整的程序,只是一个开始。稍后我将不得不从每一行的用户输入中找到一些字符串。
-
您能等到用户输入之后再读取文件吗?或者,如果您需要将整个文件保存在内存中,您可能应该有超过 255 个字符的空间!在读取时将其标记为行,并将偏移量数组存储到每行的开头可能会很有用。否则,您只需在搜索时动态检测换行符。或者你是用
'\0'分隔它们而不是换行吗?我还没弄清楚你的程序是怎么设计的。 -
你能编译这段代码吗?
jmp read_line:末尾有一个额外的冒号应该是jmp read_line。由于 TASM 不知道此语句mov [si], 0中操作数的大小(您要移动一个字节还是一个字?)它应该是mov byte ptr [si], 0,因为您似乎正在处理单个字节(字符)
标签: assembly x86 dos x86-16 tasm