アドレスを指定するという事はどういうことか
いつの事だったか忘れましたが、シェルコードを実行してみようって事をやりました。
どうやったかを思い返すと、領域違反でリターンアドレスのポインタになっている変数を利用して実行したわけですが、教本の3日目にある、「ブートセクタからOS本体を実行してみる」っていうのを見てみると JMP 0xc200 みたいな感じです。
JMP命令はアセンブラによく出てくるんだが、ブートセクタからOSを実行する時もリターンアドレスのポインタに関数を入れるのも同じ事だなと。
C言語で直接アドレスを指定して書き込む命令がないようで、「そういう事」のようだ。
これはおまけですが、C言語にHLTの命令もないそうで、著者の川合秀実さんがやたらとこだわってらっしゃって、わざわざHLTするようなプログラムにしてます。実際にタスクマネージャでリソースを見てみたら明確に違いが出てました。
HLTなし
HLTあり
こんな風に、551のある時ない時くらいに明確でした。
上の図のHLTなしの場合は永遠にCPUを使ってます。下の図のようにHLT命令があった場合は、CPUはほげーっとしている状態らしく、タスクマネージャで見ても使ってないですね。
ふむふむ。
BIOSは16BIT用の機械語で書かれている
これは見た瞬間に、こないだ自作したPCではBIOSでマウスがぐりぐり動いてたし先進的な感じだったんでバンナソカナ!!と思ったのだが、最近のものは(最近といってもIntel6シリーズ SandyBridgeから)UEFIというものが採用されているようです。
安心した。
そういえば、UEFIって書いてあったような。
と思ったので過去の画像を掘り出す。
おおお、やっぱり書いてあった。
今日のたけけんは冴えてるな、目の付け所がインテルだったようだ。
あれ、シャープだったかな。
もちろんAMDもあるよ。
C言語から機械語に翻訳することは思っているより大変なようだ。
これはもう説明するのは大変で、いろいろステップを踏む必要があるようだ。
とにかく今のコンパイラがすごかったらしい。
学校で何のコンパイラを使っていたかなんてすっかり忘れたけど、もうちょっとメンドクサカッタような記憶もあったりなかったり。
うちのPCにCygwinを入れたときもなんかメンドクサカッタ記憶しかない。
デュアルブートにしてしばらく使っていくうちにだんだんメンドクサクなり、結局ウィンドウズだけに戻したり。
とにかく昔は何をするのもメンドクサカッタ気がする。
あ~、息を吸うのもめんどくせ~までは思わないが。
以上のように、3日目の内容でもかなり盛りだくさんなのであった。
参考文献
30日でできるOS自作入門 川合秀実著