繁体   English   中英

汇编 x86 NULL 终止符 (TASM)

[英]Assembly x86 NULL terminator (TASM)

该程序必须简单地从文件中读取文本并输出。 问题是文件名是由用户输入的。

到目前为止我做了什么:

  • 我放置了一个零终止符来指示字符串的结尾
  • 并在 .exe 文件所在的确切文件夹中创建了一个新的文本文件

我得到的:

  • 无法打开文件

     .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

总结 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 以确认您确实获得了有效句柄会很棒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM