アセンブラのライブラリ(その1)


アニメ『俺が好きなのは妹だけど妹じゃない』

作画が気になって内容が入ってこないので、何度も見ることになってしまいました。
面白くなるのかはまだ分かりませんが、作画が気になるので視聴継続しようと思ってます。

アセンブラを埋め込んだC言語関数のライブラリ化をしてみます。
最初はCだけで作成。

takk@deb9:~/tmp$ cat -n main.c
     1  #include <stdio.h>
     2  unsigned long my_htonl(unsigned long);
     3  int main()
     4  {
     5          unsigned long a=0x12345678;
     6          a = my_htonl(a);
     7          printf("%08x\n",a);
     8  }
takk@deb9:~/tmp$

ファイル名は、my_htonl.cとしました。

takk@deb9:~/tmp$ cat -n my_htonl.c
     1  unsigned long my_htonl(unsigned long data)
     2  {
     3          return data;
     4  }
takk@deb9:~/tmp$

今はreturnでそのまま引数を返すだけの関数です。
gcc main.c my_htonl.c でビルド後、アセンブラを確認。

takk@deb9:~/tmp$ objdump -d a.out

~省略~

00000000000006ef <my_htonl>:
 6ef:   55                      push   %rbp
 6f0:   48 89 e5                mov    %rsp,%rbp
 6f3:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
 6f7:   48 8b 45 f8             mov    -0x8(%rbp),%rax
 6fb:   5d                      pop    %rbp
 6fc:   c3                      retq
 6fd:   0f 1f 00                nopl   (%rax)

これを参考にしてC言語に埋め込みます。

takk@deb9:~/tmp$ cat -n my_htonl.c
     1  unsigned long my_htonl(unsigned long data)
     2  {
     3          asm("mov -0x8(%rbp),%rax");
     4          asm("bswap %eax");
     5          asm("mov %rax, -0x8(%rbp)");
     6          return data;
     7  }
takk@deb9:~/tmp$

再度ビルドして確認。

takk@deb9:~/tmp$ gcc main.c my_htonl.c
takk@deb9:~/tmp$ ./a.out
78563412

エンディアン変換できました。

では、my_htonl.cのみをライブラリにしてみます。-cオプションでコンパイル。

takk@deb9:~/tmp$ rm a.out
takk@deb9:~/tmp$ gcc -c my_htonl.c
takk@deb9:~/tmp$ ls
main.c  my_htonl.c  my_htonl.o
takk@deb9:~/tmp$

アーカイブにします。

takk@deb9:~/tmp$ ar -rc libmyhtonl.a my_htonl.o
takk@deb9:~/tmp$ ls
libmyhtonl.a  main.c  my_htonl.c  my_htonl.o
takk@deb9:~/tmp$

libmyhtonl.aというライブラリができました。

ビルドしてみます。

takk@deb9:~/tmp$ gcc main.c -L. -lmyhtonl
takk@deb9:~/tmp$

結果です。

takk@deb9:~/tmp$ ./a.out
78563412
takk@deb9:~/tmp$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA