我想将一个文本写入一个从argv[1]中获取的文件,但由于某种原因,它返回以下错误:
[1]5590分段错误(核心转储)./hey hey.txt
下面是我的代码:
.section .data
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
.equ SYS_WRITE, 4
.equ SYS_READ, 3
.equ SYS_EXIT, 1
.equ LINUX_SYSCALL, 0X80
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2
.equ O_CREATE_WRITE, 03101
.equ TEXT_SIZE, 17
text:
.ascii "hey diddle diddle\0"
.section .text
.globl _start
_start:
pushl %ebp
#reserve memory for file descriptor
subl $4, %esp
#opening file we want to write to
movl $SYS_OPEN, %eax
movl 8(%ebp), %ebx #8(%ebp) is the argv[1] that's where we take our filename
movl $O_CREATE_WRITE, %ecx
movl $0666, %edx
int $LINUX_SYSCALL
movl %eax, -4(%ebp) #store file descriptor
_write_text:
# making the write syscall
movl $SYS_WRITE, %eax
movl -4(%ebp), %ebx #file descriptor in %ebx
movl $text, %ecx #Addres of text
movl $TEXT_SIZE, %edx
int $LINUX_SYSCALL
_exit:
#close the file
movl $SYS_CLOSE, %eax
movl -4(%ebp), %ebx #file dexcriptor to close
int $LINUX_SYSCALL
#exit
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
这是我如何组装和连接的:
as --32 hey.s -o hey.o
这里有什么问题,我如何直接用字符串而不是argv给它给予文件名?
1条答案
按热度按时间63lcw9qa1#
问题是这条线
我把它换成了这个,它工作得很好。
这引用到堆栈帧,所以我们可以访问文件描述符和文件名.并且为了直接给出文件名而不是argv,我们可以使用.ascii指令在数据段中定义一个符号