TVアニメ『からくりサーカス』第3弾アニメーションPV
アニメ『からくりサーカス』
すごいからくり人形です。操る糸が弱点のような気もします。絡まないのでしょうか。
こねくり回して絡まってきたアセンブラの続きです。
前回関数をアセンブラ化しましたが、少し寝かせてみると、なんだか冗長な気がしてきました。
takk@deb9:~/tmp$ cat -n my_htonl-asm.s
1 .text
2 .globl my_htonl
3 my_htonl:
4 pushq %rbp
5 movq %rsp, %rbp
6 mov %rdi, %rax
7 bswap %eax
8 popq %rbp
9 ret
10
takk@deb9:~/tmp$
最初にpush/popの枠から作成したため残ってしまいましたが、push/popの必要性を感じません。
push/popをカットしてみます。
takk@deb9:~/tmp$ cat -n my_htonl-asm.s
1 .text
2 .globl my_htonl
3 my_htonl:
4 mov %rdi, %rax
5 bswap %eax
6 ret
7
takk@deb9:~/tmp$
できました。
glibcのhtonl.Sのソースにそっくりです。
実行してみます。
takk@deb9:~/tmp$ as -o my_htonl.o my_htonl-asm.s takk@deb9:~/tmp$ gcc main.c my_htonl.o takk@deb9:~/tmp$ ./a.out 78563412 takk@deb9:~/tmp$
動いていそうです。
でも、push/popをしていないソースって、少し心配になります。
関数でラッピングしてみます。
変更前。
takk@deb9:~/tmp$ cat -n main.c
1 #include <stdio.h>
2 unsigned long my_htonl(unsigned long);
3 int main()
4 {
5 unsigned long a=0x12345678;
6 a = my_htonl(a);
7 printf("%08x\n",a);
8 }
takk@deb9:~/tmp$
変更後。
takk@deb9:~/tmp$ cat -n main.c
1 #include <stdio.h>
2 unsigned long my_htonl(unsigned long);
3 unsigned long func1(unsigned long a)
4 {
5 return my_htonl(a);
6 }
7 int main()
8 {
9 unsigned long a=0x12345678;
10 a = func1(a);
11 printf("%08x\n",a);
12 }
takk@deb9:~/tmp$
ビルド、実行。
takk@deb9:~/tmp$ gcc main.c my_htonl.o takk@deb9:~/tmp$ ./a.out 78563412 takk@deb9:~/tmp$
結果は合ってますね。
では、アセンブラを見て確認。
00000000000006b0 <func1>: 6b0: 55 push %rbp 6b1: 48 89 e5 mov %rsp,%rbp 6b4: 48 83 ec 10 sub $0x10,%rsp 6b8: 48 89 7d f8 mov %rdi,-0x8(%rbp) 6bc: 48 8b 45 f8 mov -0x8(%rbp),%rax 6c0: 48 89 c7 mov %rax,%rdi 6c3: e8 41 00 00 00 callq 709 <my_htonl> 6c8: c9 leaveq 6c9: c3 retq 00000000000006ca <main>: 6ca: 55 push %rbp 6cb: 48 89 e5 mov %rsp,%rbp 6ce: 48 83 ec 10 sub $0x10,%rsp 6d2: 48 c7 45 f8 78 56 34 movq $0x12345678,-0x8(%rbp) 6d9: 12 6da: 48 8b 45 f8 mov -0x8(%rbp),%rax 6de: 48 89 c7 mov %rax,%rdi 6e1: e8 ca ff ff ff callq 6b0 <func1> 6e6: 48 89 45 f8 mov %rax,-0x8(%rbp) 6ea: 48 8b 45 f8 mov -0x8(%rbp),%rax 6ee: 48 89 c6 mov %rax,%rsi 6f1: 48 8d 3d 9c 00 00 00 lea 0x9c(%rip),%rdi # 794 <_IO_stdin_used+0x4> 6f8: b8 00 00 00 00 mov $0x0,%eax 6fd: e8 5e fe ff ff callq 560 <printf@plt> 702: b8 00 00 00 00 mov $0x0,%eax 707: c9 leaveq 708: c3 retq 0000000000000709 <my_htonl>: 709: 48 89 f8 mov %rdi,%rax 70c: 0f c8 bswap %eax 70e: c3 retq 70f: 90 nop
func1からmy_htonlの呼び出し時に、raxをrdiにコピーしています。
my_htonlでは、そのrdiをraxにコピーして使うだけなので、問題なさそうです。


コメント