此问题在此处已有答案:
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文件没有创建,因为尝试使用两个部分。数据一个在顶部,一个在底部。没有任何工作,我如何使用两个不同文件的变量!!!
1条答案
按热度按时间mznpcxlj1#
您忘记了以零结束文件规范。但系统仍然能够打开 Nile_2,因为那里碰巧有一个零。file_name 不是这种情况,因此创建失败。您忽略了一个失败,因为您没有检查
sys_creat
返回后EAX中的内容!第一个
您没有为将收到的32位文件描述符保留足够的空间。
第一个
您没有关闭该文件,因为您忘记了写入
int 0x80
以便调用sys_close
。sys_read
提供实际读取的字节数,最好使用该值而不是硬编码值(26)。所有这些
sys_???
调用在出现错误时都会返回EAX=-1
。您不应该忽略这一点。错误处理是编程的重要部分。