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

に似ています。
一度高級言語のプログラミングに慣れると、アセンブリ言語でのプログラムに移るのは難しく、その逆は簡単…と思ってる方がおられるかもしれませんが、そんな事はありません。
今回は、その逆パターンで失敗した時のお話。
*
学生時代、コンピュータのクラブに入っていた私は、今度入ってくる新入部員のために、C言語プログラムのテスト問題を作成していました。
その時期クラブ活動では、ちょうどアセンブリ言語を使っての作業を行っていたので、頭の中は
アセンブラ脳になっていたのです。
アセンブリ言語では、ある値がプラスかマイナスなのかを判断する為に、その最上位ビットをチェックするという手段をよく使います。
1byte値の場合0x80 →最上位ビットが立っているので、負の数
0x7f →最上位ビットが立ってないので、正の数
2byte値の場合0xf7aa →最上位ビットが立っているので、負の数
0x045d →最上位ビットが立ってないので、正の数
新入部員に向けたテスト問題にも、与えられた値の正負を判断して処理が分岐するマクロを作る問題が含まれていました。
それはあくまでC言語での出題。
その問題に、当時の私はアセンブラ脳のまま挑んだのです。
「えーっと、値の正負を判断するには、最上位ビットをチェックしないといけないから…。
ん?C言語で最上位ビットってどうやって判断するんだ?
変数のサイズによって最上位ビットの位置が変わるし…。
ああそうか、sizeof()で変数のサイズを求めて、チェックするビットの位置を変えればいいのか。
あれ!?でもC言語には signed 変数と unsigned 変数がある!
unsigned 変数だったら、最上位ビットが立っててもプラスの値だから、まずはそれをチェックしないと…。
ん?その変数が unsigned かどうかって、プログラムで判断できたっけ

」
C言語が理解できる方ならおわかりでしょうが、相当テンパってます。
そんな私のところに、同じクラブの友人が慌てて

駆け寄ってきました。
この窮地を救ってくれるのかと思いきや、残念なことに彼もアセンブラ脳になっていたのです。
「おいおい!今回のC言語のテスト、難しくないか!?
一体どうやって解けばいいの

」
「俺もちょうどそれに気づいたとこや!
これ、C言語で実現するの不可能じゃない

」
と、大騒ぎしている二人に、すぐ側で見ていた、もう一人の友人が一言。
「…………
0と比較すればいいんじゃね?」
「


」
「


」
*
アセンブリ言語でプログラムする機会は、最近でこそ少なくなりましたが、それでも特定の処理の速度向上

を図るため、局所的にアセンブラ化することはあります。
上記のエピソードのような事もありますが、機会があれば是非学んでみて下さい。
ちょっとしたバイリンガル気分

が味わえます。