64位汇编:为什么ld使用32位系统调用,而不是64位调用?

时间:2016-06-08 09:13:19

标签: linux assembly ld yasm

我想知道为什么我必须使用来自/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;相反:当我的电脑像酒吧里一个肮脏的老人谈话时,我喜欢它。

0 个答案:

没有答案