Linux asm x86_64文件创建(__NR_creat 85),没有创建文件

时间:2014-11-27 00:14:41

标签: linux assembly x86-64

全部,我对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 %r9x86_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.asmnasm编译和链接是:

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

1 个答案:

答案 0 :(得分:2)

您需要使用mov rdi, ofname(即没有括号),因为您必须传递文件名的地址。顺便说一句,32位也应该是相同的。

PS:学习使用调试器和strace