C言語でx64アセンブラを覚える(その3)


アニメ『ひもてはうす』

PVやHPを全く見てなくてタイトルだけの情報だけで視聴始めました。
女子たちがモテたいと、ただお喋りするだけのアニメかと思いきや、1話の最後で全員異能を使い始めた時には本当にビビりました。なんじゃこりゃ~、カオスかっ。
いい意味で期待を裏切ってくれました。楽しめそうなので視聴続けます。

続きです。
今回は配列をアセンブラで確認してみます。
ベースのプログラムです。

takk@deb9:~/tmp$ cat -n t.c
     1  int main()
     2  {
     3          int i;
     4          int a;
     5          for(i=0;i<10;i++)
     6                  a=50;
     7  }
takk@deb9:~/tmp$

アセンブル。

takk@deb9:~/tmp$ gcc -S t.c
takk@deb9:~/tmp$ cat -n t.s
     1          .file   "t.c"
     2          .text
     3          .globl  main
     4          .type   main, @function
     5  main:
     6  .LFB0:
     7          .cfi_startproc
     8          pushq   %rbp
     9          .cfi_def_cfa_offset 16
    10          .cfi_offset 6, -16
    11          movq    %rsp, %rbp
    12          .cfi_def_cfa_register 6
    13          movl    $0, -4(%rbp)
    14          jmp     .L2
    15  .L3:
    16          movl    $50, -8(%rbp)
    17          addl    $1, -4(%rbp)
    18  .L2:
    19          cmpl    $9, -4(%rbp)
    20          jle     .L3
    21          movl    $0, %eax
    22          popq    %rbp
    23          .cfi_def_cfa 7, 8
    24          ret
    25          .cfi_endproc
    26  .LFE0:
    27          .size   main, .-main
    28          .ident  "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
    29          .section        .note.GNU-stack,"",@progbits
takk@deb9:~/tmp$

-8(%rbp)が、a
-4(%rbp)が、iですね。

では、配列の初期化処理に改造してみます。

takk@deb9:~/tmp$ cat -n t1.c
     1  int main()
     2  {
     3          int i;
     4          int a[10];
     5          for(i=0;i<10;i++)
     6                  a[i]=50;
     7  }
takk@deb9:~/tmp$

10個の配列をすべて50で初期化する処理にしました。

アセンブルして比較。

takk@deb9:~/tmp$ gcc -S t1.c
takk@deb9:~/tmp$ diff t.c t1.c
4c4
<       int a;
---
>       int a[10];
6c6
<               a=50;
---
>               a[i]=50;
takk@deb9:~/tmp$ diff t.s t1.s
1c1
<       .file   "t.c"
---
>       .file   "t1.c"
16c16,18
<       movl    $50, -8(%rbp)
---
>       movl    -4(%rbp), %eax
>       cltq
>       movl    $50, -48(%rbp,%rax,4)
takk@deb9:~/tmp$

movlが肝ですね。配列アクセスするために、オフセットをずらしながらメモリへ代入してくれる命令っぽいです。
謎の命令cltqは、よくわからないので、そのうち調べることにしましょう。

Leave a Reply

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

CAPTCHA