日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

アセンブラ時代の工夫?

最近、アセンブラでかかれた昔のプログラムを解読している。

最初はバイナリを解析させられるのかと思ったが、ちゃんとしたソースコードがあったから助かった。

あと設計を書いた資料もそれなりにあって、といっても細かい部分はソースコードを見ないとわからないんだけど。


アセンブラでプログラミングなんてあんまりやったことはないけど、高専時代にちょっとやった。

細かい記法はマイコンのコアによるけど、基本的なところは同じだ。

ニーモニックコードの意味とかはマイコンのマニュアルを見ないとわからないけど、

これがロード命令で、これが足し算でとかいうぐらいは見ればだいたいわかる。


アセンブラで書いているのは、まさにCPUの動作そのものなので、人間にとって理解しやすいかはなんとも言えない。

もともと人間が書いたソースコードなので、人間が理解できる範囲で記述されているのは確かなのだが。

とはいえ、レジスタの値を破壊しながら処理をしていくのは、なかなか読みにくい。

ビットシフトをすると、あふれたビットはキャリーフラグに入る。

これを利用して レジスタBを1ビット右シフト→キャリーフラグで分岐 ということをやるプログラムがけっこうあった。

Cだと普通はこんな書き方をするんじゃないかなぁってのが、

long flg=1, result=0;
for(long i=0;i<8;i++){
  if(((enable & flg) == flg) && judge[i]){
    result |= flg;
  }
  flg <<= 1;
}

こうなるような感じですかね。

for(long i=0;i<8;i++){
  if(((enable & 0x01) == 0x01) && judge[i]){
    result = (result>>1) | 0x80;
  }else{
    result = (result>>1);
  }
  enable >>= 1;
}

結果的に得られるものは一緒のはずだけど、どっちが直感的かっていうと前者だよね。


あと、リソースを節約するためかしらないけど、1つの変数のビットごとに意味を割り付けてあることが多いのも困った話だ。

変数Aの bit0に完了フラグ、bit5~2に動作モード、bit7~6に外部入力の状態とか。

こんなの無理やり1つの変数にまとめるなよって思うんだけどね。

ビット単位に割り付けたせいで、ビットシフト、AND・OR演算、ビット操作命令 を複雑に操る必要があるんだよね。

それをCで書いてあるならまだよいのだが、アセンブラですからね。


さすがにこれからアセンブラでコードを書くと言うことはないのでご安心を。

この解析結果を基に、新しいシステムの仕様を決めて、新しく作るのはCで書くことになる。

こうやってアセンブラのソースコードを読むと、わかりにくいなと思う一方で、人間の理解を超えない範囲で書かれていることに気付く。

Cで書いてコンパイラに機械語を作らせると、人間が理解できない機械語でもよいから、性能をもっとも引き出せる機械語を生成できる可能性が高い。

昔はマイコンのリソースも限られていたから、リソースの割り付けを人間がうまく工夫して高速化することもできたのだろう。

でもそんなのはきっと過去の話。今はコンパイラにお任せが最善策だろう。

Cで書かれていればアセンブラよりははるかに理解しやすいですから。それで十分かはさておき。


Author : hidemaro
Date : 2018/04/09(Mon) 22:42
コンピュータ | Comment | trackback (0)

Tools