程序集 x86 NULL 终止符 (TASM)

标签 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
    

最佳答案

总结 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

在此读取 block 中,您忘记在 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 以确认您确实获得了有效的句柄。

关于程序集 x86 NULL 终止符 (TASM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33633285/

相关文章:

c - GCC 错误地优化了自定义地址处变量的指针相等测试

x86 - WoW64 进程可以创建/ fork /等纯 x64 进程吗?

assembly - 直接和间接寻址以及偏移量

gcc - 为什么这个SSE2程序(整数)生成movaps(浮点)?

windows - 尝试使用纯 Win64 API(无 C 运行时)从 x64 汇编器读取控制台输入

assembly - x86 Intel 汇编器 LEA

8086 中的汇编代码

assembly - `dup (?)` 在 TASM 中是什么意思?

assembly - 英特尔 64 和 IA-32 |原子操作,包括获取/释放语义

assembly - Qemu 在设置 GDT 时无限重启