程序集x86 NULL终止符(TASM)

时间:2015-11-10 15:15:57

标签: assembly x86 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
    

1 个答案:

答案 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以确认你确实有一个有效的句柄会很棒。