ITエンジニアのブログ

IT企業でエンジニアやってる人間の日常について

プログラミング言語を作る。第2回:x86-64アセンブリ

コンパイラを作るには、手順としては最初にする必要は無いでしょうが、アセンブリの事を分かっていないとあまりイメージが湧きにくい気がします。
そのようなわけで、まずはアセンブリプログラミングをしてみようと思います。
私が使っている多くのパソコンのプロセッサは Intel core i7 が多くを占めているので、x86-64の命令セットでアセンブリを書こうと思います。

アセンブリプログラミングは、大学の講義で Power PC の命令セットで行ったことがあるので、全くの未経験というわけではありません。
しかし、何度か x86アーキテクチャは複雑といわれているらしく、実際に自分が何度かアセンブリを見てみてもあまり理解ができませんでした。
気を取り直して、もう一度 x86 アセンブリに挑戦してみようと思います。

x86 の記法にはアセンブラによって違いがあります。

今回は NASM を使います。インターネット上で得られる情報が NASM のほうが多いと思ったからです。
まずは Hello, world! プログラムを書きます。今回は下記のウェブサイトを参考にしました。

Assembly Programming on x86-64 Linux (01)

bits 64
section .text
global _start

_start:
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, msg
    mov     rdx, len
    syscall
    mov     rdi, 0
    mov     rax, 60
    syscall

section .data
    msg     db      'Hello, world!', 0x0A
    len     equ     $ - msg

rax に使用する system call に対応する番号を代入し、引数も同様に特定のレジスタに与えて syscall を呼びます。このプログラムで使ったのは write と exit です。

nasm -f elf64 a.s
ld a.o
./a.out

これを実行することで Hello, world! が出力されます。