assembly Nasm linux由于某种原因我不能同时使用两个文件变量名来打开文件和创建文件?[duplicate]

flvlnr44  于 2022-11-13  发布在  Linux
关注(0)|答案(1)|浏览(124)

此问题在此处已有答案

NASM Assembly - what is the ", 0" after this variable for?(3个答案)
Which variable size to use (db, dw, dd) with x86 assembly?(2个答案)
How should strace be used?(12个答案)
Why does the Linux Open system call not need a buffer size parameter for the path?(1个答案)
四个月前关门了。
在这里开始的代码file_name没有被创建,所以代码不能写到它我怎么在这里使用两个文件变量我不知道为什么???
以及它不会编译与gcc它确实编译与ld tho

msg db 'Welcome to Assembly programming', 0xa ;
 len equ  $ - msg ;

 msg_done db 'Written to file ', 0xa ;
 len_done equ $ - msg_done ;
 
 
  ;make the write to file here last or there is a overflow and data gets added onnamly the next line
  file_name db 'myfile.txt', 
   Nile_2 db '/home/mark/Desktop/mynewfile.txt',
  

section .bss
 fd_out resb 1
 fd_in  resb 1
 info resb  26



section .text
   global _start         ;must be declared for using gcc
    
_start:                  ;tell linker entry point _start:
   ;create the file
   mov  eax, 8
   mov  ebx, file_name
   mov  ecx, 0777        ;read, write and execute by all
   int  0x80             ;call kernel
    
   mov [fd_out], eax
    
   ; write into the file
   mov  edx,len          ;number of bytes
   mov  ecx, msg         ;message to write
   mov  ebx, [fd_out]    ;file descriptor 
   mov  eax,4            ;system call number (sys_write)
   int  0x80             ;call kernel
    
   ; close the file
   mov eax, 6
   mov ebx, [fd_out]
    
   ; write the message indicating end of file write
   mov eax, 4
   mov ebx, 1
   mov ecx, msg_done
   mov edx, len_done
   int  0x80
    
   ;open the file for reading
   mov eax, 5
   mov ebx, Nile_2      ; was file_name
   mov ecx, 0             ;for read only access
  ; mov edx, 0777          ;read, write and execute by all
   int  0x80
    
   mov  [fd_in], eax
    
   ;read from file
   mov eax, 3
   mov ebx, [fd_in]
   mov ecx, info
   mov edx, 26
   int 0x80
    
   ; close the file
   mov eax, 6
   mov ebx, [fd_in]
   int  0x80    
    
   ; print the info 
   mov eax, 4
   mov ebx, 1
   mov ecx, info
   mov edx, 26
   int 0x80
       
   mov  eax,1             ;system call number (sys_exit)
   int  0x80              ;call kernel

Nile_2文件中的数据打印到屏幕上,但file_name文件没有创建,因为尝试使用两个部分。数据一个在顶部,一个在底部。没有任何工作,我如何使用两个不同文件的变量!!!

mznpcxlj

mznpcxlj1#

file_name db 'myfile.txt', 
 Nile_2 db '/home/mark/Desktop/mynewfile.txt',
  • Nile_2* 文件中的数据将打印到屏幕,但不会创建 file_name 文件

您忘记了以零结束文件规范。但系统仍然能够打开 Nile_2,因为那里碰巧有一个零。file_name 不是这种情况,因此创建失败。您忽略了一个失败,因为您没有检查sys_creat返回后EAX中的内容
第一个
您没有为将收到的32位文件描述符保留足够的空间。
第一个
您没有关闭该文件,因为您忘记了写入int 0x80以便调用sys_close
sys_read提供实际读取的字节数,最好使用该值而不是硬编码值(26)。
所有这些sys_???调用在出现错误时都会返回EAX=-1。您不应该忽略这一点。错误处理是编程的重要部分。

相关问题