全部,我对x86_64程序集file create
有困难。在x86上创建的文件工作正常。例如,在x86上,使用模式__NR_creat 8
调用(0420
)会导致创建具有0644 octal -rw-r--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 and %r9
)x86_64 ABI (A.2.1 Calling Convention),我希望文件创建能够工作同样在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差异的任何其他信息。我在此处提供了一个最低限度可验证的示例:filecreat_64.asm。 nasm
编译和链接是:
nasm -f elf64 -o filecreat_64.o filecreat_64.asm
ld -o filecreat_64 filecreat_64.o
答案 0 :(得分:2)
您需要使用mov rdi, ofname
(即没有括号),因为您必须传递文件名的地址。顺便说一句,32位也应该是相同的。
PS:学习使用调试器和strace
。