Linux Assembly x86_64 create a file using command line parameters

限于喜欢 提交于 2021-01-29 05:00:59

问题


I'm trying to teach myself assembly. I've found a good website; however, everything is written for x86 and I use a 64-bit machine.

I know what the problem is, but I don't know how to fix it. If I run the program with strace, then here is the results:

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

So, I know that when I call creat, that the file name "hello" is not being passed and as a result I don't have a file descriptor.

Here is the code in question:

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 

I know that I can use the syscall command; however, I want to use interrupt.

Any ideas or suggestions would be helpful. Also, I'm using nasm an assembler.


回答1:


You attempted to use the 32 bit mechanism. If you have a 32 bit tutorial, you can of course create 32 bit programs and those will work as-is in compatibility mode. If you want to write 64 bit code however, you will need to use the 64 bit conventions and interfaces. Here, that means the syscall instruction with the appropriate registers:

  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

See also the x86-64 sysv abi on wikipedia or the abi pdf for more details.



来源:https://stackoverflow.com/questions/36071711/linux-assembly-x86-64-create-a-file-using-command-line-parameters

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!