TVアニメ【RELEASE THE SPYCE】第二弾PV
アニメ『RELEASE THE SPYCE』
テンポが良くてすごく面白いです。最終話まで継続視聴予定です。
ずっとエンディアン変換のアセンブラを作っていて、気がつきました。
C言語とディスアセンブルしたコードを対比していけば、アセンブラの修得も早そうです。
さっそく学習を始めることにします。普段使いのPCはPentiumなので、x64アセンブラを覚えていくことにします。
takk@deb9:~/tmp$ cat /proc/cpuinfo | grep model.name model name : Intel(R) Pentium(R) CPU G4400 @ 3.30GHz takk@deb9:~/tmp$
では、ベースのソースとして、空のmain.cを作成。
takk@deb9:~/tmp$ cat -n t.c 1 int main() 2 { 3 4 } 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, %eax 14 popq %rbp 15 .cfi_def_cfa 7, 8 16 ret 17 .cfi_endproc 18 .LFE0: 19 .size main, .-main 20 .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" 21 .section .note.GNU-stack,"",@progbits takk@deb9:~/tmp$
変数定義を追加してみましょう。
takk@deb9:~/tmp$ cat -n t1.c 1 int main() 2 { 3 int a; 4 } takk@deb9:~/tmp$
そして、アセンブル。比較。
takk@deb9:~/tmp$ gcc -S t1.c takk@deb9:~/tmp$ diff t.s t1.s 1c1 < .file "t.c" --- > .file "t1.c" takk@deb9:~/tmp$
変数を定義しただけでは、何も変わらないということですね。
次は、変数の初期化を追加。
takk@deb9:~/tmp$ cat -n t2.c 1 int main() 2 { 3 int a; 4 a = 50; 5 } takk@deb9:~/tmp$
アセンブルして、差分を見ます。
takk@deb9:~/tmp$ gcc -S t2.c takk@deb9:~/tmp$ diff t.s t2.s 1c1 < .file "t.c" --- > .file "t2.c" 12a13 > movl $50, -4(%rbp) takk@deb9:~/tmp$
ロカール変数の領域である-4(%rbp)に、50を格納する命令が増えています。
次は、if文を使います。
takk@deb9:~/tmp$ cat -n t3.c 1 int main() 2 { 3 int a; 4 a = 50; 5 if(a == 50){ 6 a = 30; 7 } 8 } takk@deb9:~/tmp$
アセンブル、比較。
takk@deb9:~/tmp$ gcc -S t3.c takk@deb9:~/tmp$ diff t.s t3.s 1c1 < .file "t.c" --- > .file "t3.c" 12a13,17 > movl $50, -4(%rbp) > cmpl $50, -4(%rbp) > jne .L2 > movl $30, -4(%rbp) > .L2: takk@deb9:~/tmp$
比較命令であるcmplが50という値と、ローカル変数-4(%rbp)の値を比較しています。
jneは、not equalsなので、不一致なら.L2へジャンプする命令ですね。
コメント