Think Essentially

計算機テクノロジー全般が好きです

x86_64 Linux アセンブリ入門

体裁

以下は"hello, world!"を出力するhello.asmの内容である

section .data
    text db "Hello, world"

section .text
    global _start  ; リンカがエントリポイントを識別するために設定される

; 以下はラベル, 慣例的に_を接頭辞とする
_start:
    mov rax, 1     ; ID: 1 --> sys_write
    mov rdi, 1     ; ファイルディスクリプタ, 1なので標準出力
    mov rsi, text  ; textはアドレスである。つまり"hello, world"が書き込まれたアドレスを指定している。
    mov rdx, 12    ; 指定アドレスから読み込む文字数
    syscall        ; システムコール発行

; ここからシステム終了のためのsysコールを呼ぶ
    mov rax, 60    ; ID: 60 --> sys_exit
    mov rdi, 0     ; エラーコード = 0で終了。つまり正常終了
    syscall

アセンブル

nasm -f elf64 -o hello.o hello.asm
  • -f: アセンブルターゲットファイルの指定
  • -o: 出力ファイルの名前指定

リンク

ただ.asmをアセンブルをしただけでは実行は出来ない。リンカを用いて関連ファイルをリンクすることで初めて実行ファイルとなる。 恐らくシステムコールのラベルと命令フローを定義したファイル等をリンクしていると思われる。

ld hello.o 

上記により、helloファイルが生成される

実行

./hello
Hello, world% 

参考

x86_64 Linux Assembly #1 - "Hello, World!" - YouTube

test

test

test