NASM:如何使用系统调用附加到文件? (64位)

时间:2018-01-31 12:10:58

标签: linux assembly nasm

我正在创建一个文件,然后使用系统调用打开它。

创建:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VDS.RDF.Parsing;
using VDS.RDF.Query;
using VDS.RDF;

开放:

mov rax, 85
mov rdi, path
mov rsi, 400
syscall

写作:

mov rax, 2
mov rdi, path
mov rsi, 2 ; I found somewhere that I should use 400 to append
syscall
mov r8, rax ; save the file handle

在我完成这些步骤之后,我自然地关闭了文件,但是我无法附加到它并且每次执行这些操作时它只是重写文件的内容,但是例如我计算了前n个素数并存储了他们在一些记忆中消失了,现在我想在文件中写下这些n个素数,但是如果不添加更多行,我就无法这样做。还有一种方法可以不在mov rax, 1 mov rdi, r8 mov rsi, output mov rdx, length syscall 中指定字符串的长度,而是让字符串以rdx终止吗?

1 个答案:

答案 0 :(得分:3)

要附加到文件,请在O_APPEND = 0x400中将int flags标记用作rsi参数。所以你很接近:它是十六进制400的值,而不是你怀疑的十进制400.

以下是十六进制的原始int flags值列表:

O_ACCMODE                        = 0x3
O_APPEND                         = 0x400
O_ASYNC                          = 0x2000
O_CLOEXEC                        = 0x80000
O_CREAT                          = 0x40
O_DIRECT                         = 0x4000
O_DIRECTORY                      = 0x10000
O_DSYNC                          = 0x1000
O_EXCL                           = 0x80
O_FSYNC                          = 0x101000
O_LARGEFILE                      = 0x0
O_NDELAY                         = 0x800
O_NOATIME                        = 0x40000
O_NOCTTY                         = 0x100
O_NOFOLLOW                       = 0x20000
O_NONBLOCK                       = 0x800
O_RDONLY                         = 0x0
O_RDWR                           = 0x2
O_RSYNC                          = 0x101000
O_SYNC                           = 0x101000
O_TRUNC                          = 0x200
O_WRONLY                         = 0x1

所以这应该有效:

mov rax, 2
mov rdi, path
mov rsi, 0x441   ; O_CREAT| O _WRONLY | O_APPEND
syscall
mov r8, rax      ; save the file handle

我添加了三个值来创建文件(如果它不存在)或者以write_only模式打开它(如果它存在的话)。

  

还有一种方法可以不在rdx中指定字符串的长度,而是将字符串以/ 0终止吗?

简而言之:没有 创建strlen函数并将结果传递给rdx