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" と言っている理由がわかるはずです: 私のコンピューターが、バーにいる汚れた老人のように私に話しかけてくるのが好きです。 .