我正在努力教自己装配。我发现了一个很好的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汇编程序。
答案 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