LoginSignup
4
2

More than 5 years have passed since last update.

ちょっとだけアセンブラを触ってみる

Last updated at Posted at 2015-04-13

とりあえず、Cからアセンブラで書いた関数を呼び出してみるテスト。

main.c
#include <stdio.h>

int add(int a, int b);

int main() {
    int ret = add(3, 5);
    printf("%d\n", ret);
    return 0;
}

このadd関数をアセンブラで書いてみます。(x64系想定)

add.s
section .text

global _add

_add:
    mov rax, rdi
    add rax, rsi
    ret

こんな感じでそれぞれコンパイル。

ちなみに rax, rdi, rsi の意味は以下になります。

  • rax ... 関数の戻り値を格納する
  • rdi ... 関数の第一引数の引数を格納する
  • rsi ... 関数の第二引数を格納する

つまり言語化すると、
raxrdi(第一引数)を mov(移動)し、それに rsi(第二引数)を add する。そしてそれを関数の戻り値とする」
という意味になります。

$ nasm -f macho64 add.s
$ gcc -c main.c
$ gcc -o main main.o add.o

実行すると結果が出力される。

$ ./main
8

まだまだ分からないことだらけだけど、とりあえずアセンブラがどういうルールでなにをしているかはなんとなく分かってきた。

ちなみに rax とか最初は謎だったけど、それらを調べてつらつらとメモったやつはこちらで公開してます。

4
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2