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