NASM汇编语言似乎无法将输出保存到文件中

时间:2016-10-01 00:41:30

标签: assembly nasm

好的,所以我跟着一个教程,我一直在绞尽脑汁...我已经尝试寻找资源,但似乎没有任何工作或点击。我想要做的就是从文件读取输入,逐个字符然后继续将其保存到另一个文件。 (如果你愿意,可以复制) 现在我遇到了两个让我疯狂的主要问题。

  1. 由于某种原因,文件的输出被打印到终端屏幕。多数民众赞成,但是当我写这篇文章的时候,这并不是我想到的。它应该只是写入文件并退出。
  2. 运行脚本后,“输出文件”会被创建,但它是空的
  3. 我在https://www.tutorialspoint.com/assembly_programming/assembly_file_management.htm

    上找到了以下的教程
    section .data
        f_in: db "file_input.txt",0
        f_out: db "file_output.txt",0
    section .bss
        Buff resb 1     ;hold the value of one char
        fd_in resb 1
        fd_out resb 1
    section .data
    global _start
    _start:
        nop         ;keeps gdb debugger happy
    ;Creates the output file that will be used to store
    Create:
        mov eax, 8      ;sys call, create
        mov ebx, f_out      ;file name is ebx register
        mov ecx, 666q       ;file permisions for the outfile in octal
        int 80h         ;kernel call
        mov [fd_out], eax   ;mov file desc into fd_out
    
    ;Open the input file to be read in read only mode
    ;(0) = read only
    ;(1) = write only
    ;(2) = read write only
    Open:
        mov eax, 5      ;sys call, open
        mov ebx, f_in       ;file name in ebx
        mov ecx, 0      ;file access mode (0) == read only
        int 80h         ;kernel call
        mov [fd_in], eax    ;mov file desc into fd_in
    
    ;Read the opened file data into Buff var declared above
    ;Buff only holds 1 byte
    Read:   
        mov eax, 3      ;sys call, read
        mov ebx, [fd_in]    ;mov file desc in ebx
        mov ecx, Buff       ;mov pointer Buff into ecx
        mov edx, 1      ;mov Buff size into edx
        int 80h
    
        cmp eax, 0      ;check val in eax with 0
        je Exit         ;if eax is (0 means EOF) so exit
    
    ;write all the data encoded into the file
    Write:
        mov eax, 4      ;sys call, write
        mov ebx, [fd_out]   ;file descriptor
        mov ecx, Buff       ;message to write
        mov edx, 1      ;length of message
        int 80h
        jmp Read        ;go back to begining and read again
    
    Exit:
    ;close the files
    Close_files:
        mov eax, 6      ;sys call, close
        mov ebx, [fd_in]    ;put file descriptor in ebx
        int 80h
        mov ebx, [fd_out]
        int 80h
    ;now exit after files are closed
        mov eax, 1      ;sys call, exit
        int 80h
    

1 个答案:

答案 0 :(得分:3)

使用fd_in resb 1fd_out resb 1,您只能为文件句柄保留一个字节。但是,您可以在这些位置读取和写入整个ebxebx长度为4个字节。这不会很好。

对两个文件句柄尝试resb 4

对正是发生的事情的解释:打开输出文件,然后将句柄存储在fd_out中。文件句柄可能类似于5,所以5写在fd_out,接下来的3个字节用零清除。然后,打开输入文件,并将句柄存储在fd_in中。例如,这个文件句柄是6,所以6写在fd_in中,后面的3个字节被清除,这意味着fd_out被清除,因为它位于fd_in之后在记忆中。然后,下次将fd_out加载到ebx时,您正在读取四个零字节,这意味着0.文件句柄0显然对应于标准输出,这就是为什么所有内容都被转储到屏幕。