Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Linux asm x86_64文件创建(uu NR_creat 85),未创建任何文件_Linux_Assembly_X86 64 - Fatal编程技术网

Linux asm x86_64文件创建(uu NR_creat 85),未创建任何文件

Linux asm x86_64文件创建(uu NR_creat 85),未创建任何文件,linux,assembly,x86-64,Linux,Assembly,X86 64,总之,我在x86_64汇编文件创建方面遇到了困难。在x86上创建的文件工作正常。例如,在x86上,使用模式0420调用(NR\u create 8)会创建八进制权限为0644八进制-rw-r--文件权限的文件: mov eax, 8 ; system call number (sys_creat) mov ebx, [fnbuf] ; set ebx to filename mov ecx, 0420 ; 644

总之,我在x86_64汇编
文件创建方面遇到了困难。在x86上创建的文件工作正常。例如,在x86上,使用模式
0420
调用(
NR\u create 8
)会创建八进制权限为
0644八进制-rw-r--
文件权限的文件:

mov     eax, 8              ; system call number (sys_creat)
mov     ebx, [fnbuf]        ; set ebx to filename
mov     ecx, 0420           ; 644 octal -rw-r--r--
int     0x80                ; call kernel
虽然
asm-x86/unistd_64.h
中的系统调用号更改为
85
,x86_64上的内核调用约定更改为(
%rdi、%rsi、%rdx、%r10、%r8和%r9
),但我希望文件创建在x86_64上也能起到同样的作用。更改代码后,调用将变为:

mov     rax, 85             ; __NR_creat x86_64 syscall
mov     rdi, [ofname]       ; filename in rdi
mov     rsi, 0420           ; 644 octal -rw-r--r--
syscall                     ; call kernel
但是,不会创建任何文件。x86和x86_64之间是否还有我所缺少的其他差异。任何帮助都将不胜感激。我已经查阅了关于这个问题的所有参考资料,但找不到关于x86_64 sys_creat差异的任何其他信息。我这里有一个最小的可验证示例:。
nasm
编译和链接是:

nasm -f elf64 -o filecreat_64.o filecreat_64.asm
ld  -o filecreat_64 filecreat_64.o

由于必须传递文件名的地址,因此需要使用名为的mov rdi(即无括号)。顺便说一句,这在32位中也应该是相同的


PS:学习使用调试器和
strace

谢谢。除了strace,我什么都用了。我使用
gdb
反编译了一个简短的
fopen
示例,但没有运行asm文件。我曾经使用过x86,由于一些无法解释的原因,它成功了。再次感谢。这是一个forrest for the trees的问题,我本可以多看几个小时。。。