好的,所以我跟着一个教程,我一直在绞尽脑汁...我已经尝试寻找资源,但似乎没有任何工作或点击。我想要做的就是从文件读取输入,逐个字符然后继续将其保存到另一个文件。 (如果你愿意,可以复制) 现在我遇到了两个让我疯狂的主要问题。
我在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
答案 0 :(得分:3)
使用fd_in resb 1
和fd_out resb 1
,您只能为文件句柄保留一个字节。但是,您可以在这些位置读取和写入整个ebx
。 ebx
长度为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显然对应于标准输出,这就是为什么所有内容都被转储到屏幕。