1

我想知道为什么我必须使用来自/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 */

如果你已经通过这篇文章做到了这一点,你就会知道为什么我的“你好世界”程序说“嘿你美女”:我喜欢我的电脑像酒吧里的一个肮脏的老人一样跟我说话.

4

0 回答 0