Linux Assembly x86_64使用命令行参数创建文件

时间:2016-03-17 21:07:57

标签: linux assembly x86-64

我正在努力教自己装配。我发现了一个很好的website;但是,一切都是为x86编写的,我使用的是64位机器。

我知道问题是什么,但我不知道如何修复它。如果我用strace运行程序,那么结果如下:

execve("./file", ["./file", "hello"], [/* 94 vars */]) = 0
creat(NULL, 0)                          = -1 EINVAL (Invalid argument)
write(0, NULL, 0 <unfinished ...>
+++ exited with 234 +++

所以,我知道当我调用creat时,文件名“hello”没有被传递,因此我没有文件描述符。

以下是相关代码:

section .text
  global _start

_start:
  pop rbx ; argc
  pop rbx ; prog name
  pop rbx ; the file name

  mov eax,85 ; syscall number for creat()
  mov ecx,00644Q ; rw,r,r
  int 80h ; call the kernel 

我知道我可以使用syscall命令;但是,我想使用中断。

任何想法或建议都会有所帮助。另外,我正在使用nasm汇编程序。

1 个答案:

答案 0 :(得分:6)

您试图使用32位机制。如果您有32位教程,您当然可以创建32位程序,这些程序将在兼容模式下按原样运行。 但是,如果要编写64位代码,则需要使用64位约定和接口。这里,这意味着带有适当寄存器的syscall指令:

  global _start

_start:
  mov eax,85       ; syscall number for creat()
  mov rdi,[rsp+16] ; argv[1], the file name
  mov esi,00644Q   ; rw,r,r
  syscall          ; call the kernel 
  xor edi, edi     ; exit code 0
  mov eax, 60      ; syscall number for exit()
  syscall

有关更多详细信息,另请参阅wikipedia上的x86-64 sysv abi或abi pdf