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

https://www.youtube.com/watch?v=3Pg7ZasceEE
アニメ『ラディアン』

フランスの漫画原作ってことで気になって見ていますが、今のところ目新しさはないかなあと思います。面白さが分からない状態で見るのはなかなか苦痛。しかし、日本の漫画に似せて作られてはいるけれど、日本人の発想では出てこないものがあるらしい、って話を信じて根性で継続視聴予定です。

Intel系も飽きてきたので、ARMのアセンブラも覚えておこうかと思います。
手元にラズパイがあるので活用してみます。

pi@raspberrypi:~ $ cat /proc/cpuinfo | grep model.name
model name      : ARMv7 Processor rev 4 (v7l)
model name      : ARMv7 Processor rev 4 (v7l)
model name      : ARMv7 Processor rev 4 (v7l)
model name      : ARMv7 Processor rev 4 (v7l)
pi@raspberrypi:~ $

ARMv7です。

まず、ベースとするのは、x64の時にも使った空のmainです。

pi@raspberrypi:~/tmp $ cat -n t.c
     1  int main(){
     2  
     3  
     4  }
pi@raspberrypi:~/tmp $

アセンブル。

pi@raspberrypi:~/tmp $ gcc -S t.c
pi@raspberrypi:~/tmp $ cat -n t.s
     1          .arch armv6
     2          .eabi_attribute 28, 1
     3          .eabi_attribute 20, 1
     4          .eabi_attribute 21, 1
     5          .eabi_attribute 23, 3
     6          .eabi_attribute 24, 1
     7          .eabi_attribute 25, 1
     8          .eabi_attribute 26, 2
     9          .eabi_attribute 30, 6
    10          .eabi_attribute 34, 1
    11          .eabi_attribute 18, 4
    12          .file   "t.c"
    13          .text
    14          .align  2
    15          .global main
    16          .syntax unified
    17          .arm
    18          .fpu vfp
    19          .type   main, %function
    20  main:
    21          @ args = 0, pretend = 0, frame = 0
    22          @ frame_needed = 1, uses_anonymous_args = 0
    23          @ link register save eliminated.
    24          str     fp, [sp, #-4]!
    25          add     fp, sp, #0
    26          mov     r3, #0
    27          mov     r0, r3
    28          add     sp, fp, #0
    29          @ sp needed
    30          ldr     fp, [sp], #4
    31          bx      lr
    32          .size   main, .-main
    33          .ident  "GCC: (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516"
    34          .section        .note.GNU-stack,"",%progbits
pi@raspberrypi:~/tmp $

x64より多めのコードが生成されました。

では、変数の定義と初期化を加えてみます。

pi@raspberrypi:~/tmp $ cat -n t1.c
     1  int main(){
     2          int a;
     3          a = 50;
     4  }
pi@raspberrypi:~/tmp $

アセンブルして差分確認します。

pi@raspberrypi:~/tmp $ gcc -S t1.c
pi@raspberrypi:~/tmp $ diff t.s t1.s
12c12
<       .file   "t.c"
---
>       .file   "t1.c"
21c21
<       @ args = 0, pretend = 0, frame = 0
---
>       @ args = 0, pretend = 0, frame = 8
25a26,28
>       sub     sp, sp, #12
>       mov     r3, #50
>       str     r3, [fp, #-8]
pi@raspberrypi:~/tmp $

movは、右から左への代入のようですね。
r3に50を代入して、そのr3をstr命令でローカル変数の領域へストアしているように見えます。

コメント

タイトルとURLをコピーしました