HEXA BLOG
ヘキサブログ
日記
アセンブラ脳
こんにちは、ナカムラです。
アセンブリ言語でプログラムを組んだ経験のある方はおられますでしょうか?
ヘキサドライブ日記でも、イワサキが時々アセンブラでの説明を行っていますが、
アセンブリ言語でのプログラミングと、その他の高級言語でのプログラミングでは、頭の使い方が少々変わってきます。
具体的にどのように違うのかを説明するのは難しいんですけど、限られた命令と限られたレジスタを駆使して、最速最小のプログラムを作る作業は、パズルを解く感覚に似ています。
一度高級言語のプログラミングに慣れると、アセンブリ言語でのプログラムに移るのは難しく、その逆は簡単…と思ってる方がおられるかもしれませんが、そんな事はありません。
今回は、その逆パターンで失敗した時のお話。
学生時代、コンピュータのクラブに入っていた私は、今度入ってくる新入部員のために、C言語プログラムのテスト問題を作成していました。
その時期クラブ活動では、ちょうどアセンブリ言語を使っての作業を行っていたので、頭の中はアセンブラ脳になっていたのです。
アセンブリ言語では、ある値がプラスかマイナスなのかを判断する為に、その最上位ビットをチェックするという手段をよく使います。
1byte値の場合
0x80 →最上位ビットが立っているので、負の数
0x7f →最上位ビットが立ってないので、正の数
2byte値の場合
0xf7aa →最上位ビットが立っているので、負の数
0x045d →最上位ビットが立ってないので、正の数
新入部員に向けたテスト問題にも、与えられた値の正負を判断して処理が分岐するマクロを作る問題が含まれていました。
それはあくまでC言語での出題。
その問題に、当時の私はアセンブラ脳のまま挑んだのです。
「えーっと、値の正負を判断するには、最上位ビットをチェックしないといけないから…。
ん?C言語で最上位ビットってどうやって判断するんだ?
変数のサイズによって最上位ビットの位置が変わるし…。
ああそうか、sizeof()で変数のサイズを求めて、チェックするビットの位置を変えればいいのか。
あれ!?でもC言語には signed 変数と unsigned 変数がある!
unsigned 変数だったら、最上位ビットが立っててもプラスの値だから、まずはそれをチェックしないと…。
ん?その変数が unsigned かどうかって、プログラムで判断できたっけ」
C言語が理解できる方ならおわかりでしょうが、相当テンパってます。
そんな私のところに、同じクラブの友人が慌てて駆け寄ってきました。
この窮地を救ってくれるのかと思いきや、残念なことに彼もアセンブラ脳になっていたのです。
「おいおい!今回のC言語のテスト、難しくないか!?
一体どうやって解けばいいの」
「俺もちょうどそれに気づいたとこや!
これ、C言語で実現するの不可能じゃない」
と、大騒ぎしている二人に、すぐ側で見ていた、もう一人の友人が一言。
「…………0と比較すればいいんじゃね?」
「」
「」
アセンブリ言語でプログラムする機会は、最近でこそ少なくなりましたが、それでも特定の処理の速度向上を図るため、局所的にアセンブラ化することはあります。
上記のエピソードのような事もありますが、機会があれば是非学んでみて下さい。
ちょっとしたバイリンガル気分が味わえます。
CATEGORY
- about ヘキサ (166)
- 部活動 (6)
- CG (18)
- プロジェクトマネジメント (1)
- 研修 (4)
- 美学 (1)
- いいモノづくり道 (230)
- 採用 -お役立ち情報も- (149)
- プログラム (188)
- デザイン (99)
- ゲーム (274)
- 日記 (1,104)
- 書籍紹介 (113)
- その他 (872)
- 就活アドバイス (20)
- ラーメン (3)
- ライフハック (25)
- イベント紹介 (10)
- 料理 (23)
- TIPS (7)
- 怖い話 (3)
- サウンド (5)
- 子育て (1)
- 筋トレ (1)
- 商品紹介 (21)
- アプリ紹介 (31)
- ソフトウェア紹介 (33)
- ガジェット紹介 (12)
- サイト紹介 (10)
- 研究・開発 (34)
- 回路図 (4)
- アナログゲーム (40)
- 交流会 (21)
- 報告会 (3)
- インフラ (25)
- グリとブラン (6)
- カメラ (9)
- クラフト (27)
- 部活 (14)
- 画伯 (15)
- カレー (6)
- 音楽(洋楽) (6)
- 映画・舞台鑑賞 (43)
- 飼育 (5)
- いぬ (8)
- ねこ (19)
ARCHIVE
- 2024年
- 2023年
- 2022年
- 2021年
- 2020年
- 2019年
- 2018年
- 2017年
- 2016年
- 2015年
- 2014年
- 2013年
- 2012年
- 2011年
- 2010年
- 2009年
- 2008年
- 2007年