Linux asm x86_64文件创建(uu NR_creat 85),未创建任何文件
总之,我在x86_64汇编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上创建的文件工作正常。例如,在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的问题,我本可以多看几个小时。。。