開発日記

Erlangをダラダラ書きます。

久々の投稿.最近はアセンブラにハマっている.

アセンブラにハマっている.

坂井先生の「大熱血!アセンブラ入門」を読み始めた.

説明が丁寧なうえ従来とは異なるアプローチでアセンブラを読み解いていてとても面白い.

この本では,目的ベースで話が進んでいく.まずC言語のコードを読み,何をするコード何か理解する.そしてそのコードの実行ファイルを逆アセンブルした結果を眺める.

目的ベースでアセンブラを読むため,アセンブラの気持ちを伺いながら読むことができる.この流れが個人的にしっくりきていて読んでいて楽しい.

これからアセンブラの世界にどっぷり浸かりそうな気がしている. 自分はRISC-Vのコアを触ることが多いので,RISC-Vのアセンブラを他のRISC-Vライクなコアと比べてみるのもとても楽しそうだ.

本のページ数は1000ページ越えととても多いが,ゆっくり読み進めようと思う.

今はPart1のChapter6を読んでいるのだが,そこで「命令エイリアス」について学んだ.

命令エイリアス

命令エイリアスというのは,アセンブラの命令に別名を名付けた命令のことを指す.

例えば,MIPSでは,レジスタのコピーを行うmove命令が実はエイリアス命令で,中身はaddu命令だったりする.

これはRISCライクなアーキテクチャアセンブラではよくあることで,メリットがある.

メリット

  • 命令数を削減できる.RISCライクなアーキテクチャは固定命令長を採用していることが多い.したがって機械語コードに含められるオペコードの数に限りがある.同じような命令はエイリアスとして同じように扱うことで,カバーできる命令を増やすことができる.

  • 回路面積を減らせる.命令を増やすとその分の独立した回路が必要になるため回路面積が大きくなる.回路面積を減らせると消費電力も減るし小型化できるため良いことが多い.

上記で紹介したレジスタ間の値のコピーだけでなく,即値の代入やnop命令など,エイリアス命令として実装できる命令は意外と多くある.

ちょっと疑問なこと

  • レジスタ間のコピーをエイリアスで実現する方法は,本で学んだ限り2つある.1つは「OR演算」を利用する方法.もう1つは,「加算命令とゼロレジスタ」を利用する方法である.本の中ではPowerPCはOR演算を利用しており,MIPSではゼロレジスタを利用していた.この2つの方法はアセンブラ依存で変わるらしいのだが,実際のアセンブラの開発者はどういう理由でエイリアスのぱたーんを採用しているのだろうか? 気まぐれで採用されるのだろうか?

この疑問に答えられるだけの知識が今の自分にはないため,ここに一旦疑問として残しておく.

もしわかる方がいらっしゃったら教えていただきたいです.

今日はこの辺で.