フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【4日目】OS自作入門を読んで振り返りと注意点

30日でできる! OS自作入門

30日でできる! OS自作入門

今回の内容

前回の終わりからC言語に入ったので、今回もC言語がメインです。

C言語でサポートされる「メモリに対して値を書き込む説明」が多く、ポインタや変数宣言の内容がテーマです。個人的には説明がかんたんで、詳しく書かれていたのですっと入り込んできましたね。

前にアセンブラの内容について解説があり、それをC言語ではこのように書きますよという説明だったのが大きいんじゃないかと思います。一見外から見るととっつきにくいバイナリ・アセンブラ・C言語ですが本書ではとっつきやすいです。

アセンブラで特定のメモリアドレスに対して直接値を書き込むやり方がありますが、これをC言語ではポインタという機能を使って実現しています。なかなかC言語をやるときのつまづきポイントらしいのですが、本書ではアセンブラを経由してC言語の説明をしてくれるので理解ができます。

アセンブラの

MOV ECX,3 MOV BYTE [ECX], 2

がC言語でいうところのこれだそうです。

p = (char * ) 0x03; *p = 2;

メモリ番号3番には2がはいります。

ひとつ驚いたのはp[i]で利用される変数が、ふつうは配列を示すことが多いのにC言語ではメモリ番地を示すということ。p =0 で p[0xffff] = 10ならメモリの0xffffに10という値を格納するという意味だそうです。へえーーー。

  • *(p+i)
  • *(i+p)
  • p[i]
  • i[p]

はすべて同じ意味だそうです。つまり普段a[0]やa[1]で示されていたのはメモリa番地に格納されている値と、a+1のメモリ番地に格納されている値だったということです。

定数

で、ややこしいのが定数ですね。

char a[3]と宣言するとaが定数と呼ばれる変数となり、アセンブラでいうところのラベルなんだそうです。そしてRESB 3が準備されますのでaというラベルで3バイト確保されるという意味になります。先ほどのp[i]はpが番地変数であるという前提においてp+iのメモリ番地を意味していましたが、似た形なのに違うわけです。ややこしい。

さいごに

とりあえず、今日はやりはじめてはじめて二日にまたがってしまいました・・・ すでに30日では完成しなくなってしまった!!!