assembly 我如何在汇编程序中写入文件?

dy2hfwbg  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(149)

我想将一个文本写入一个从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给它给予文件名?

63lcw9qa

63lcw9qa1#

问题是这条线

pushl %ebp

我把它换成了这个,它工作得很好。

movl %esp, %ebp

这引用到堆栈帧,所以我们可以访问文件描述符和文件名.并且为了直接给出文件名而不是argv,我们可以使用.ascii指令在数据段中定义一个符号

filename:
    .ascii "hey.txt\0"

相关问题