割り算りとシフト演算
仕事にかまけてブログの更新を行っておりませんでした。
本日は仕事にてチューニングしなければいけない状態になった際に、試しに割り算とシフト演算を逆アセンブルした結果を乗せたいと思います。
実行環境:Windows Vista
コンパイル:gcc(MinGW)
割り算
#include
void main() {
int val = 512;
val /= 2;
printf( "%d\n", val );
}
main.o: file format pe-i386
Disassembly of section .text:
00000000 <_main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 20 sub $0x20,%esp
9: e8 00 00 00 00 call e <_main+0xe>
e: c7 44 24 1c 00 02 00 movl $0x200,0x1c(%esp)
15: 00
16: 8b 44 24 1c mov 0x1c(%esp),%eax
1a: 89 c2 mov %eax,%edx
1c: c1 ea 1f shr $0x1f,%edx
1f: 8d 04 02 lea (%edx,%eax,1),%eax
22: d1 f8 sar %eax
24: 89 44 24 1c mov %eax,0x1c(%esp)
28: 8b 44 24 1c mov 0x1c(%esp),%eax
2c: 89 44 24 04 mov %eax,0x4(%esp)
30: c7 04 24 00 00 00 00 movl $0x0,(%esp)
37: e8 00 00 00 00 call 3c <_main+0x3c>
3c: c9 leave
3d: c3 ret
3e: 90 nop
3f: 90 nop
シフト演算
#include
void main() {
int val = 512;
val >>= 1;
printf( "%d\n", val );
}
main2.o: file format pe-i386
Disassembly of section .text:
00000000 <_main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 20 sub $0x20,%esp
9: e8 00 00 00 00 call e <_main+0xe>
e: c7 44 24 1c 00 02 00 movl $0x200,0x1c(%esp)
15: 00
16: d1 7c 24 1c sarl 0x1c(%esp)
1a: 8b 44 24 1c mov 0x1c(%esp),%eax
1e: 89 44 24 04 mov %eax,0x4(%esp)
22: c7 04 24 00 00 00 00 movl $0x0,(%esp)
29: e8 00 00 00 00 call 2e <_main+0x2e>
2e: c9 leave
2f: c3 ret
アセンブラの実行命令数が減るようなので早くはなるようです。
しかし今回、逆アセンブルしたのがPC上であり、私が仕事でチューニングしなければいけないものは別環境となってしまうので、その場合にはまた違う結果が出るかと思います。
逆アセンブル方法のメモ
gcc -c main.c
objdump -d main.o >> main.txt
本日は仕事にてチューニングしなければいけない状態になった際に、試しに割り算とシフト演算を逆アセンブルした結果を乗せたいと思います。
実行環境:Windows Vista
コンパイル:gcc(MinGW)
割り算
#include
void main() {
int val = 512;
val /= 2;
printf( "%d\n", val );
}
main.o: file format pe-i386
Disassembly of section .text:
00000000 <_main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 20 sub $0x20,%esp
9: e8 00 00 00 00 call e <_main+0xe>
e: c7 44 24 1c 00 02 00 movl $0x200,0x1c(%esp)
15: 00
16: 8b 44 24 1c mov 0x1c(%esp),%eax
1a: 89 c2 mov %eax,%edx
1c: c1 ea 1f shr $0x1f,%edx
1f: 8d 04 02 lea (%edx,%eax,1),%eax
22: d1 f8 sar %eax
24: 89 44 24 1c mov %eax,0x1c(%esp)
28: 8b 44 24 1c mov 0x1c(%esp),%eax
2c: 89 44 24 04 mov %eax,0x4(%esp)
30: c7 04 24 00 00 00 00 movl $0x0,(%esp)
37: e8 00 00 00 00 call 3c <_main+0x3c>
3c: c9 leave
3d: c3 ret
3e: 90 nop
3f: 90 nop
シフト演算
#include
void main() {
int val = 512;
val >>= 1;
printf( "%d\n", val );
}
main2.o: file format pe-i386
Disassembly of section .text:
00000000 <_main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 e4 f0 and $0xfffffff0,%esp
6: 83 ec 20 sub $0x20,%esp
9: e8 00 00 00 00 call e <_main+0xe>
e: c7 44 24 1c 00 02 00 movl $0x200,0x1c(%esp)
15: 00
16: d1 7c 24 1c sarl 0x1c(%esp)
1a: 8b 44 24 1c mov 0x1c(%esp),%eax
1e: 89 44 24 04 mov %eax,0x4(%esp)
22: c7 04 24 00 00 00 00 movl $0x0,(%esp)
29: e8 00 00 00 00 call 2e <_main+0x2e>
2e: c9 leave
2f: c3 ret
アセンブラの実行命令数が減るようなので早くはなるようです。
しかし今回、逆アセンブルしたのがPC上であり、私が仕事でチューニングしなければいけないものは別環境となってしまうので、その場合にはまた違う結果が出るかと思います。
逆アセンブル方法のメモ
gcc -c main.c
objdump -d main.o >> main.txt
2011/07に買った書籍
![]() | アート・オブ・コミュニティ ―「貢献したい気持ち」を繋げて成果を導くには (2011/05/26) Jono Bacon 商品詳細を見る |
2940円
![]() | Adaによるソフトウェア開発―ソフトウェア工学とAda導入のすすめかた (1991/05) イアン ゾンマヴィル、ロン モリソン 他 商品詳細を見る |
6930円
![]() | Rails3レシピブック 190の技 (2011/07/25) 高橋 征義、松田 明 他 商品詳細を見る |
3129円
![]() | 7つの言語 7つの世界 (2011/07/23) Bruce A. Tate 商品詳細を見る |
3360円
![]() | Rubyの絵本 (2008/09/04) アンク 商品詳細を見る |
1764円
![]() | 30日でできる! OS自作入門 (2006/03) 川合 秀実 商品詳細を見る |
3990円
![]() | プログラミング言語を作る (2009/06/20) 前橋 和弥 商品詳細を見る |
3129円
合計25242円
Rubyを触ってみた
先週の土曜日から月曜日に行われたRubykaigiに参加してきたので、ついにRubyを触ってみようと環境構築を行いました(ぇ
Rubykaigiに参加しながらRubyにほとんど触れたことがない人間は私ぐらいしかいなかったんじゃないでしょうか
とりあえず、初心者本のRubyの絵本を買ってきてポチポチ実行しています。
私や私の友人は言語の学習を始める場合はだいたい絵本シリーズを買います。
学校で最初にCの絵本からやり始めた名残でしょう、絵も多いですし、ソースコードの量も多くないので一冊目に買って踏み台にするには軽いレベルで良いと思います。
ちなみにRubyの絵本の中に
puts "変数aに変数bを代入"
と書かれている部分がありますが、下記のようなエラーが出ます。
test.rb:17: invalid multibyte char (US-ASCII)
どうやら、文字コードが違う雰囲気が出ています、US-ASCIIだと日本語が表示できないのでエラーが出ているのでしょう。
軽く調べてみると、1.9の最新バージョンから問題が発生しているよう
問題の原因としては多言語化仕様になって、初期設定が英語であるUS-ASCIIに設定されているため、明示的に日本語であることを記述しないといけないようです。
なので、下記のマジックコードをスクリプトの先頭に記述すればエラーは回避できるとのことでした。
# -*- encoding: Shift_JIS -*-
動的片付けはあまり触れないので、この機会に勉強しようと思います。
Rubykaigiに参加しながらRubyにほとんど触れたことがない人間は私ぐらいしかいなかったんじゃないでしょうか
とりあえず、初心者本のRubyの絵本を買ってきてポチポチ実行しています。
私や私の友人は言語の学習を始める場合はだいたい絵本シリーズを買います。
学校で最初にCの絵本からやり始めた名残でしょう、絵も多いですし、ソースコードの量も多くないので一冊目に買って踏み台にするには軽いレベルで良いと思います。
ちなみにRubyの絵本の中に
puts "変数aに変数bを代入"
と書かれている部分がありますが、下記のようなエラーが出ます。
test.rb:17: invalid multibyte char (US-ASCII)
どうやら、文字コードが違う雰囲気が出ています、US-ASCIIだと日本語が表示できないのでエラーが出ているのでしょう。
軽く調べてみると、1.9の最新バージョンから問題が発生しているよう
問題の原因としては多言語化仕様になって、初期設定が英語であるUS-ASCIIに設定されているため、明示的に日本語であることを記述しないといけないようです。
なので、下記のマジックコードをスクリプトの先頭に記述すればエラーは回避できるとのことでした。
# -*- encoding: Shift_JIS -*-
動的片付けはあまり触れないので、この機会に勉強しようと思います。
【書評】Being Geek【感想】
本書はソフトウェア開発者のキャリアを成功させるためのHackのための本である。
と書かれているために、高度な技術者の体系について書かれた本だと思って買うと火傷を負います。私は負いました。
中に書かれていることは実際にマネージャーや他のスーツ族とどのように関わっていくかが大部分の内容となります。
ギーグであり続けるためのと書かれておりますが、この本を読んでもギーグであり続けられるのかは疑問を持ちます。
アメリカならば問題はないのかもしれませんが、日本だとこの本に書かれている内容が実践できないのは新卒レベルじゃないのかなっと思うので、もう少し技術分野について書かれている本だったら良かったと感じました。
著者自身がマネージャーなためにマネージャー寄りの視点になるのは致し方がないと思いますが、それならば帯のコメントを変更するべきではないかと思います。
本の内容としては面白かっただけにタイトルや帯で損をしている内容でした。
と書かれているために、高度な技術者の体系について書かれた本だと思って買うと火傷を負います。私は負いました。
中に書かれていることは実際にマネージャーや他のスーツ族とどのように関わっていくかが大部分の内容となります。
ギーグであり続けるためのと書かれておりますが、この本を読んでもギーグであり続けられるのかは疑問を持ちます。
アメリカならば問題はないのかもしれませんが、日本だとこの本に書かれている内容が実践できないのは新卒レベルじゃないのかなっと思うので、もう少し技術分野について書かれている本だったら良かったと感じました。
著者自身がマネージャーなためにマネージャー寄りの視点になるのは致し方がないと思いますが、それならば帯のコメントを変更するべきではないかと思います。
本の内容としては面白かっただけにタイトルや帯で損をしている内容でした。
![]() | Being Geek ―ギークであり続けるためのキャリア戦略 (2011/06/25) Michael Lopp 商品詳細を見る |
2011/06に買った書籍
![]() | Being Geek ―ギークであり続けるためのキャリア戦略 (2011/06/25) Michael Lopp 商品詳細を見る |
2415円
![]() | ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか (2004/09) ジュニア,ヘンリー・S. ウォーレン 商品詳細を見る |
3570円
合計:5985円












