我想知道为什么我必须使用来自/usr/include/asm/unistd_32.h
,而不是 unistd_64.h
的系统调用号码,即使我使用的是64位寄存器并组装和链接(我认为)适当的命令:
$ yasm -f elf64 hellow.asm
$ ld -m elf_x86_64 -o hey hellow.o
文件hellow.asm是(我知道我使用数字4代表写入,1代表退出,如32.h中所示,因为使用64.h中的那些不是'写的是那里写的是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 */
如果您通过这篇文章做到了这一点,那么您已经知道为什么我的&#34;你好世界&#34;节目说&#34;嘿你美女&#34;相反:当我的电脑像酒吧里一个肮脏的老人谈话时,我喜欢它。