linux 在GNU程序集中使用write syscall写入文件[重复]

2vuwiymt  于 2023-10-16  发布在  Linux
关注(0)|答案(1)|浏览(112)

此问题已在此处有答案

C — Why «write» can't write in file?(1个答案)
How to read from and write to files using NASM for x86-64bit(2个答案)
16天前关闭

.global _start
.intel_syntax noprefix

.text
_start:
    /*
    This is writing a file in ASM
    */
    mov rax, 2              // open opcode
    lea rdi, [rip+file]     // const *
    mov rsi, 0100           // O_CREAT
    mov rdx, 0700           // RWX mode 
    syscall

    mov rdi, rax            // copy the fd rax as the last syscall returned that
    lea rsi, [rip+message]  // message pointer
    mov rdx, 13             // message length
    mov rax, 1              // write opcode
    syscall

    /*
        This is exiting in ASM
    */
    mov rax, 60 // exit opcode
    mov rdi, 0  // exit with 0
    syscall

.data
message:
    .ascii "Hello sailor\n" // normal string

file:
    .asciz "main" // null terminated string

使用open创建文件可以按预期工作。
我正在尝试写入我在这里创建的文件。正如你所看到的,我传递了正确的操作码和指向缓冲区的指针以及长度。
我期待的消息是在文件中,当我猫它,但它是空的现在。
另一个注意事项是,当我将文件描述符更改为1或2时,它会按预期打印到终端,所以我很确定字符串不是问题。

qpgpyjmq

qpgpyjmq1#

使用strace ./a.out可以看到open("main", O_RDONLY|O_CREAT, 0700) = 3
这意味着我在只读模式下打开文件。为了不这样做,我将该行改为mov rsi, 0100|02,这意味着我现在以读写模式打开它。

相关问题