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