クリプキクローネ日記帳

ある種の音楽と数学とランニングはミニマルなところが似ていると思う。

プログラムの不思議を解く -実力派プログラマのための教養としてのアセンブラ入門- [日向俊二(著)]

なんだかすごいタイトルですが、割と素直なアセンブラ解説本です。
1つ1つの命令にはあまり踏み込まずにCのソースと照らし合わせながら全体の流れを追うことを主眼としているようです。



アセンブラを読むとすごく痛感するのは、変数名って大事だなということです。
%eaxとか%edxとかですらしんどいのに、-4(%rbp)とやられるともうどこに何があったかさっぱりわかりません。

アキュムレータRAXは結果が格納されるだけあってかなり酷使されていますね。
レジスタごとに役目が違うのは効率的で高速なアーキテクチャという意味で重要なんだと思いますが、
ソースコードだけ読むとなんだか無駄にレジスタ間コピーが発生しているように見えてしまいますね。
特にRAXと他のレジスタの間の受け渡しが多いです。

あとFPUの命令が読みづらいです。
浮動小数点レジスタスタックがオペランドに明示的に表れないからだと思います。
今スタックがどうなっているか想定しながら読むのが難しいです。

構文に関しては、
if(A){ B }else{ C }
みたいな基本的な構造でさえも

.L1:
cmpl A
jle .L2
B
jmp .L3
.L2:
C
.L3:

みたいな感じでダイクストラさんに怒られそうな構造になるのがおもしろいです。
こう見ると、switch文でbreakを書かないと次のcaseに流れるというCの言語仕様は極めて自然だなと思います。
初めて知ったときはなんだそれと思いましたが。

フラグレジスタのフラグはよくできてますよねほんとに。
ただの引き算も値の比較もフラグレジスタのおかげで同じような処理ができるというのは効率的です。

データ構造に関しては、
配列や構造体を関数のstaticでないローカル変数として持つと
オーバーヘッドが大きいという既知の事実をより痛感しました。
アセンブラにバカでかいわけの分からないマジックナンバーがあったときには
文字列(4文字分を表す4バイト値)である可能性があると分かりました。

共用体はEAX, AX, AH, AL みたいにレジスタの名前を変えるだけで
同じ領域に違うサイズでアクセスできるのでアセンブラ向きのデータ構造ですね。
Cはコンパイラに優しい。

関数呼び出しは引数をレジスタ渡ししておいて、
それをスタックに積んでからまた計算のためにレジスタに戻すという操作がまだるっこしいです。
Cの予約語「register」を使いたくなりました。
全然使ったことないけど。
ある日突然inlineを使いまくりたくなる現象に似ています。

全体的にアセンブラの処理の流れをそのまま日本語で書いているだけのページが多いので
細かいことが全然分からないことが多いのですが、
細かく掘り下げるとCPUのアーキテクチャにたどり着いて進まなくなりそうなので
たまにはこういう全体をざっくり追える本もいいと思いました。
アセンブラを追うことに抵抗が少なくなればいいんですが。




  1. 2017/06/03(土) 01:34:28|
  2. | トラックバック:0
  3. | コメント:0
<<NHK「迷宮美術館」巨匠の言葉 | ホーム | FPGAの原理と構成 [天野英晴(編)]>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://myumbrella.blog42.fc2.com/tb.php/378-237371db
この記事にトラックバックする(FC2ブログユーザー)