我想知道为什么我必须使用来自/usr/include/asm/unistd_32.h
, not unistd_64.h
的系统调用号,即使我正在使用 64 位寄存器并使用(我认为)适当的命令进行组装和链接:
$ yasm -f elf64 hellow.asm
$ ld -m elf_x86_64 -o hey hellow.o
文件 hello.asm 是(我知道我在 32.h 中使用数字 4 进行写入,使用数字 1 进行退出,因为使用 64.h 中的数字不起作用。那里的 Write 是 1,并且退出 60,我尝试了没有结果的那些。)
section .data
msg db "hey you beauty", 0xe
len equ $ - msg ; length of string
section .text
global _start ; for linker
_start: ;linker entry point
mov rdx,len ;message length
mov rcx,msg ;msg to write
mov rbx,1 ;file descriptor (stdout)
mov rax,4 ;system call number (write)
int 0x80 ; call kernel
mov rax,1 ; system call (exit)
int 0x80 ; call kernel
file
在可执行文件和目标文件上返回:
目标文件:ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
可执行:ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
我/usr/include/unistd.h
的是:
#ifndef _ASM_X86_UNISTD_H
#define _ASM_X86_UNISTD_H
/* x32 syscall flag bit */
#define __X32_SYSCALL_BIT 0x40000000
# ifdef __i386__
# include <asm/unistd_32.h>
# elif defined(__ILP32__)
# include <asm/unistd_x32.h>
# else
# include <asm/unistd_64.h>
# endif
#endif /* _ASM_X86_UNISTD_H */
如果你已经通过这篇文章做到了这一点,你就会知道为什么我的“你好世界”程序说“嘿你美女”:我喜欢我的电脑像酒吧里的一个肮脏的老人一样跟我说话.