コンパイラの出力

まぁ実際に日常的に書く必要はないけど、コンパイラの出力を想像できるぐらいにはなっとかないとプロとしてはまずいと思う。コンパイラの出力を想像するという意味では、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 コンパイラの最適化をなめてないかい?
アトミックな処理というのをわからないと排他制御の必要がわからないというのはそのとおりだと思うけど、それってアセンブリのレベルまで落とさないと説明できないのかな。