1

64 ビット レジスタを使用し、(私が思うに) 適切なコマンドをアセンブルしてリンクしているにもかかわら/usr/include/asm/unistd_32.h、ではなくからのシステムコール番号を使用する必要があるのはなぜだろうと思っています。 unistd_64.h

$ yasm -f elf64 hellow.asm 
$ ld -m elf_x86_64 -o hey hellow.o

ファイルhellow.asmは(64.hのものを使用すると機能しないため、32.hのように書き込みに4、終了に1を使用していることを認識しています。書き込みは1であり、 exit 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 */

この投稿をここまで読んだなら、私の "hello world" プログラムが代わりに "hey you beauty" と言っている理由がわかるはずです: 私のコンピューターが、バーにいる汚れた老人のように私に話しかけてくるのが好きです。 .

4

0 に答える 0