TVアニメ『転生したらスライムだった件』PV第2弾
『転生したらスライムだった件』
スライムはゲームとかだと最弱モンスターですが、このアニメは、最強モンスターのようです。とにかくチート主人公です。最初はスライムってことであまり真剣に見る気はなかったんですが、めちゃ面白いですねえ。
今回は、三項演算子のアセンブラです。
三項演算子は一行にif文が書けて分かりやすいですね。まあ例えばこんな感じで。
takk@deb9:~/tmp$ cat tt.c #include <stdio.h> int main() { int a=0; printf("%s\n", a == 0 ? "zero" : "not zero"); a = 100; printf("%s\n", a == 0 ? "zero" : "not zero"); } takk@deb9:~/tmp$ gcc tt.c takk@deb9:~/tmp$ ./a.out zero not zero takk@deb9:~/tmp$
では、三項演算子をアセンブラコードにすると、効率的なんでしょうか。
t.cがif文、t1.cが三項演算子を使ったプログラムです。
takk@deb9:~/tmp$ cat -n t.c 1 int main() 2 { 3 int a=10; 4 int b; 5 if(a == 10) 6 b = 100; 7 else 8 b = 200; 9 } takk@deb9:~/tmp$ cat -n t1.c 1 int main() 2 { 3 int a=10; 4 int b; 5 b = a == 10 ? 100 : 200; 6 } takk@deb9:~/tmp$
t.cのアセンブラは、前も見ましたね。
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 $10, -4(%rbp) 14 cmpl $10, -4(%rbp) 15 jne .L2 16 movl $100, -8(%rbp) 17 jmp .L3 18 .L2: 19 movl $200, -8(%rbp) 20 .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$
t1.cもアセンブラにして比較すると、
takk@deb9:~/tmp$ gcc -S t1.c takk@deb9:~/tmp$ diff t.s t1.s 1c1 < .file "t.c" --- > .file "t1.c" 16c16 < movl $100, -8(%rbp) --- > movl $100, %eax 19c19 < movl $200, -8(%rbp) --- > movl $200, %eax 20a21 > movl %eax, -8(%rbp) takk@deb9:~/tmp$
三項演算子のアセンブラでは、ローカル変数へ直接値を格納せずに、一度eaxレジスタへ格納してからローカル変数へ格納しています。
eaxレジスタを使う分、三項演算子のニモニックの方が一行多いです。
1行多いからといって処理時間が長くなるとは限りませんが、レジスタを無駄に使っているようにも見えます。
コメント