2008年08月29日

アセンブラ脳

こんにちは、ナカムラです。

アセンブリ言語でプログラムを組んだ経験のある方はおられますでしょうか?

ヘキサドライブ日記でも、イワサキが時々アセンブラでの説明を行っていますが、
アセンブリ言語でのプログラミングと、その他の高級言語でのプログラミングでは、頭の使い方が少々変わってきます。
具体的にどのように違うのかを説明するのは難しいんですけど、限られた命令と限られたレジスタを駆使して、最速最小のプログラムを作る作業は、パズルを解く感覚ひらめきに似ています。

一度高級言語のプログラミングに慣れると、アセンブリ言語でのプログラムに移るのは難しく、その逆は簡単…と思ってる方がおられるかもしれませんが、そんな事はありません。
今回は、その逆パターンで失敗した時のお話。


学生時代、コンピュータのクラブに入っていた私は、今度入ってくる新入部員のために、C言語プログラムのテスト問題を作成していました。
その時期クラブ活動では、ちょうどアセンブリ言語を使っての作業を行っていたので、頭の中はアセンブラ脳になっていたのです。


アセンブリ言語では、ある値がプラスかマイナスなのかを判断する為に、その最上位ビットをチェックするという手段をよく使います。

1byte値の場合
0x80 →最上位ビットが立っているので、負の数
0x7f →最上位ビットが立ってないので、正の数

2byte値の場合
0xf7aa →最上位ビットが立っているので、負の数
0x045d →最上位ビットが立ってないので、正の数

新入部員に向けたテスト問題にも、与えられた値の正負を判断して処理が分岐するマクロを作る問題が含まれていました。
それはあくまでC言語での出題。
その問題に、当時の私はアセンブラ脳のまま挑んだのです。

「えーっと、値の正負を判断するには、最上位ビットをチェックしないといけないから…。
 ん?C言語で最上位ビットってどうやって判断するんだ?
 変数のサイズによって最上位ビットの位置が変わるし…。
 ああそうか、sizeof()で変数のサイズを求めて、チェックするビットの位置を変えればいいのか。
 あれ!?でもC言語には signed 変数と unsigned 変数がある!
 unsigned 変数だったら、最上位ビットが立っててもプラスの値だから、まずはそれをチェックしないと…。
 ん?その変数が unsigned かどうかって、プログラムで判断できたっけexclamation&question

C言語が理解できる方ならおわかりでしょうが、相当テンパってます。

そんな私のところに、同じクラブの友人が慌ててあせあせ(飛び散る汗)駆け寄ってきました。
この窮地を救ってくれるのかと思いきや、残念なことに彼もアセンブラ脳になっていたのです。

「おいおい!今回のC言語のテスト、難しくないか!?
 一体どうやって解けばいいのexclamation&question
「俺もちょうどそれに気づいたとこや!
 これ、C言語で実現するの不可能じゃないexclamation&question

と、大騒ぎしている二人に、すぐ側で見ていた、もう一人の友人が一言。

「…………0と比較すればいいんじゃね?

exclamationがく〜(落胆した顔)
exclamationがく〜(落胆した顔)



アセンブリ言語でプログラムする機会は、最近でこそ少なくなりましたが、それでも特定の処理の速度向上グッド(上向き矢印)を図るため、局所的にアセンブラ化することはあります。
上記のエピソードのような事もありますが、機会があれば是非学んでみて下さい。

ちょっとしたバイリンガル気分ぴかぴか(新しい)が味わえます。

posted by 管理人 at 10:50 | 日記