Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
64位NASM中的Linux sys_open返回负值_Linux_X86 64_Nasm - Fatal编程技术网

64位NASM中的Linux sys_open返回负值

64位NASM中的Linux sys_open返回负值,linux,x86-64,nasm,Linux,X86 64,Nasm,我正在使用sys\u open和sys\u write打开一个现有文件以写入其中。当我创建一个新文件时,sys_write工作正常,如下所示。但是如果我使用sys_open,返回值是负数(-13,表示“权限被拒绝”),并且写操作不起作用(当然) 这项工作: section .data File_Name: db '/opt/Test_Output_Files/Linux_File_Test',0 File_Mode: dq 754q Write_Buffer: db 'This is what

我正在使用sys\u open和sys\u write打开一个现有文件以写入其中。当我创建一个新文件时,sys_write工作正常,如下所示。但是如果我使用sys_open,返回值是负数(-13,表示“权限被拒绝”),并且写操作不起作用(当然)

这项工作:

section .data
File_Name: db '/opt/Test_Output_Files/Linux_File_Test',0
File_Mode: dq 754q
Write_Buffer: db 'This is what I want to write',0

section .text

; Create file
mov rax,85 ; sys_creat
mov rdi,File_Name
mov rsi,File_Mode  ; mode (permissions)
syscall

mov rdi,rax ; return code from sys_creat
mov rax,1 ; sys_write
mov rsi,Write_Buffer
mov rdx,29
syscall
但当我打开现有文件时,sys_open命令失败:

mov rax,2 ; sys_open
mov rdi,File_Name
mov rsi,2 ;read-write
mov rdx,[File_Mode]
syscall
因为这是一个权限错误,所以问题很可能是rsi中的flags值,因为rdx中的mode值与我在sys_creat(754)中使用的相同。根据和的Linux手册页,有三个必需选项:

O_RDONLY - Open for reading only. 
O_WRONLY - Open for writing only. 
O_RDWR - Open for reading and writing. The result is undefined if this flag is applied to a FIFO.
我知道read-only是零,所以我假设write-only和read-write是1和2,但我还没有找到我们在汇编语言中使用的任何数值列表,这与基于chmod的模式不同——它与我在create中使用的模式值相同,可以工作

我对此进行了广泛的研究,但是关于64位系统调用的信息很少——大部分是32位的。对于NASM,我需要为rsi中的标志使用一个数值。手册页上写着“此外,零个或多个文件创建标志和文件状态标志可以是按位的,也可以是按位的。文件创建标志是O_CLOEXEC、O_CREAT、O_DIRECTORY、O_EXCL、O_NOCTTY、O_NOFOLLOW、O_TMPFILE和O_TRUNC。”如果知道它们的值,我可以按位或按位创建它们


谢谢你在这方面的帮助

我的猜测是,您没有试图打开的文件的O_RDWR权限

你应该试试看

无论如何,我想回答你的问题。 就标志值而言,这些值将是:

O_CREAT(0x40)
O_TRUNC(0x200)
O_APPEND(0x400)
您可以在以下位置找到整个列表:

/usr/include/asm-generic/fcntl.h

注意:如果未设置O_CREAT,则“模式”(您在rdx中设置的值)将被忽略。

尝试直接使用mov rsi 0754o对您的模式进行编码。谢谢,但不幸的是,这也不起作用。“返回值为负值”究竟是什么?即,您得到的具体错误是什么?@RTC222执行syscall指令后rax寄存器中的值是多少?你说是否定的,但实际数字是多少?我更新了上面的问题-返回值是-13,权限被拒绝。这表明,正如我上面所说,问题在于rsi中的标志值。我还没有找到任何标志数值的来源,所以我可以对它们进行异或运算以创建正确的值。Linux手册页中的值适用于C程序,但不适用于汇编。谢谢。我会处理这个,稍后再发回来。为什么是Ordonly?我需要写入这个文件。它是用写权限创建的。您引用的include文件可能会导致正确的组合。只是为了测试O_RDONLY是否有效。一旦确认了这一点,您就必须弄清楚为什么sys_create没有为您的文件设置正确的权限。i、 你要根据fcntl.h,那是零。我现在就试试。只读(0)有效。仅写(1)和读写(2)都失败,拒绝-13权限。在sys_create调用中,您有mov rsi,File_模式不应该是mov rsi,[File_模式]