« float 嫌い | トップページ | WhiteTV は便利だ »

メモリ嫌い

 「float 嫌い」はちょっと年寄りの自慢話臭かったので、今度は失敗談を一つ(^^)。

 float が嫌いだったころのぼくは、アセンブラでコードを書くときに、メモリにアクセスするのも嫌いでした。なぜかというと、8086 のころは、レジスタアクセスとメモリアクセスのクロック数に結構な差があって、わざわざアセンブラでコードを書く以上は、少しでもクロック数の少ないコードにすることに命をかけていたからです(^^)。

 8086 には、ax、bx、cx、dx、bp、sp、si、di と名前の違うレジスタがたくさんあって、それぞれ微妙に使い勝手が違うのです。いい加減忘れましたけど、ループのカウンタには cx しか使えなかったり、配列のインデックスには si、di しか使えないとかいろいろあったのね。だから、効率的にレジスタを使うには、職人芸的な使い回しが必要でした。

 あるとき、ありったけのレジスタを使っても、中間結果をすべて保存しきれないことがありました。そのとき、ふと思ったのです。「この sp というレジスタは変更しちゃいけないと思い込んでいたけど、考えてみたら、関数の入口で中身をメモリに保存しておいて、関数から抜けるときに戻しとけばいいんじゃないの?」。

 当時のぼくは、これが素晴らしい思いつきのような気がして、早速そういうコードを書いてみました。ところが、そのコードを実際に動かしてみると、うまく動くこともあるのですが、たびたび暴走する。しかし、コードをいくら眺めてみても、原因がわかりません。そこで、デバッガでトレースしてみると、メモリの内容がいつの間にか破壊されていることがわかりました。

(すでにオチがわかってしまった人、そんなに笑わないで! わからない人は、ここでちょっとオチを考えて見ましょう。勉強になるかもよ(^^)。)

 混乱したぼくは、先輩に聞いてみました。

「このマシン壊れてるんじゃないかと思うんですけど。だって、何もしないのに、いつの間にかメモリの内容が変わってるんですよ」。

 その先輩は、ぼくのコードをしばらく眺めてから、こう言いました。

 「バカだなあ。スタックポインタを勝手に動かしたらだめだろ。」

 「え、でも、関数から抜けるときには元に戻してるんですよ。」

 「ダメだよ。割り込みかかったらどうするんだよ。」

 そう。愚かな私は、ハードウェア割り込みというものの存在を知らなかったのでありました。お後がよろしいようで(^^)。

|

« float 嫌い | トップページ | WhiteTV は便利だ »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67762/8731749

この記事へのトラックバック一覧です: メモリ嫌い:

« float 嫌い | トップページ | WhiteTV は便利だ »