コンパイラの出力
まぁ実際に日常的に書く必要はないけど、コンパイラの出力を想像できるぐらいにはなっとかないとプロとしてはまずいと思う。コンパイラの出力を想像するという意味では、gdbとかでアセンブラレベルデバグを嫌っちゅーほどして慣れるのが一番近道かな。そのうちアセンブラコードの並びを見てCソースコードのどの行かわかるようになる。
ふむふむ。なるほど。さて以下のコードはそれぞれ、ある関数を逆アセンブリしたものですが、どういう処理でしょう。
mov %edi,%eax mov $0x55555556,%edx imul %edx mov %edi,%eax sar $0x1f,%eax sub %eax,%edx lea (%rdx,%rdx,2),%edx sub %edx,%edi
mov %edi,%eax mov $0x66666667,%edx sar $0x1f,%edi imul %edx sar %edx sub %edi,%edx
バイナリアンはこういうのもさくさく読むんでしょうね。Cならったった1行なんですけどね。いやぁ、すごい。つうか、C コンパイラの最適化をなめてないかい?
アトミックな処理というのをわからないと排他制御の必要がわからないというのはそのとおりだと思うけど、それってアセンブリのレベルまで落とさないと説明できないのかな。