所有,我有x86_64程序集file create
困难。 在x86上的文件创build工作正常。 例如,在x86上,使用模式0420
调用( __NR_creat 8
)会导致创build一个具有八进制权限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约定) ,我希望文件创build工作在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
但是,没有创build文件。 x86和x86_64之间是否存在其他差异? 任何帮助,将不胜感激。 我已经通过每一个我可以find关于这个问题的参考,我无法findx86_64 sys_creat差异的任何额外的信息。 我有一个最低可validation的例子: filecreat_64.asm 。 nasm
编译和链接是:
nasm -f elf64 -o filecreat_64.o filecreat_64.asm ld -o filecreat_64 filecreat_64.o
你需要使用mov rdi, ofname
(即没有括号),因为你必须传递文件名的地址。 顺便说一下,在32位上也应该是一样的。
PS:学习使用调试器和strace
。