Linux 程序集 x86_64 使用命令行参数创建文件

Linux Assembly x86_64 create a file using command line parameters

我正在自学组装。我找到了一个很好的 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 汇编器。

您试图使用 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 or the abi pdf 上的 x86-64 sysv abi。