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命令でローカル変数の領域へストアしているように見えます。


コメント