アクセスすることもできます。アクセスすることが可能です。アセンブリコードをながめるそれでは、前置きが長くなりましたが実際のアセンブリコードを眺めてみます。関数部分を抜き出してみます。関数がラベルとして定義されています。関数の処理となりそうです。よってスタックに退避しておき、現在のスタックポインタをベースポインタに設定しています。することで、ベースポインタを元に戻しているかと思います。つづく箇所では、ローカル変数のセットアップをしています。バイト分保持しているのだと思います。アドレスに書き込んでいます。以下の画像のような状態になります。いうレジスタに転送しています。関数のアセンブリの中で参照されているため後ほど説明します。関数を呼び出している箇所です。命令を使用しています。関数を呼び出す直前までコードを追うことができました。関数の中身は以下のようになっています。こちらも順にコードを追ってみます。関数の先頭にもあらわれたものです。関数で使用していたベースポインタになります。関数で使用していたものをスタックに退避する必要があります。命令でスタックへの退避を行っています。新しいベースポンタとして、現在のスタックポインタを設定しています。関数を呼び出す際に引数として渡した値をスタック領域にコピーしています。-8(%rbp)つづく箇所では、実際にたし算が行われます。レジスタに転送しています。レジスタに結果を保持します。レジスタに転送しています。レジスタとするといった規則があるためです。関数の後半ここまでで、関数呼び出しをし演算を行って関数からもどってくるところまでいきました。残りのコードは以下のようになっています。%rsppopq%rbpretqまず初めに以下の命令です。レジスタを初期化しています。初期化しているコードになります。位置に保存しています。関数の戻り値を代入しています。場所にデータを保存していたため、どうやら同じアドレスには保存していないようです。あるのも影響しているのかもしれません。関数の終了処理を行っています。引いていたため、その確保した領域の後始末となります。言語のプログラムのフローをアセンブリコードで追うことができました。言語のコードがアセンブリでどのように表現されているかを確認するために、実際にアセンブリコードをはいてみて中身を眺めてみました。みた限りでは難しく読めなさそうなアセンブリコードでしたが、ひとつずつ読み解いていくと何をおこなっているのかを理解することができるかと思います。どのように動いているかなどは日頃意識しなくてもプログラミングは可能ですが、この低レイヤーな部分を覗いてみるのも面白いなと感じました。今回は、プログラムはなぜ動くのかという本を読んだので、その感想を書いていきます。上でどのような原理で動作するのか?といったことが書かれている本になります。ぴったりな本だと思いました。解釈されるかや、演算に使われるレジスタの紹介などが書かれています。章ではデータをコンピュータ上でどう表現するかが書かれています。ついて知ることができます。不動小数点についてもこの章で学ぶことができます。分探索木などのデータ構造の紹介もされています。章ではメモリとディスクの関係性について書かれています。プログラムが実行時にディスクからメモリにロードされることや、ディスクキャッシュ、仮想メモリ、ページイン、ページアウトなどについても概要を知ることができます。ディスクについてはその物理構造であるセクタ、クラスタなどの紹介がされています。データの圧縮法(ランレングス符号化、ハフマン符号化)が簡潔に紹介されています。ハードウェアや、ソースコードを実行ファイルになるまでのコンパイラや、リンカについて説明がなされています。プログラムを実行するために、ディスクからメモリにロードし、変数の領域、関数の領域、スタック領域と、ヒープ領域が確保され、再配置情報から実行時のメモリアドレスが決まることについて書かれています。上で動き、また、ハードウェアを制御したりするかが書かれています。扱うかなどの外観を掴むことができます。Docker上でOSをビルドするこんにちは。本をのんびりとすすめています。仕組みについて自作しながら学べる素晴らしい本だと思います。ちなみに新しめの本だた、最近以下の本も発売されたみたいなので、こちらの本で入門されるのも良いかもしれません。日目で開発環境周りでつまづいたのでそのことについてまとめます。上で開発を行っていました。情に資料を残してくださっているおかげでわりとすんなり環境構築ができました。非常に参考になったのでおすすめです。本ブログでも環境構築の内容を上記のブログ、リポジトリを参考にしながら書いているのでよかったら参考にしてみてください。言語のコンパイル(リンカ)周りでつまづきました。オプションがない模様です。2019年6月9日Cコンパイラを作成し始めた話こんにちは、kz_moritaです。普段はiOSエンジニアとしてSwiftを書いたり、最近ではNuxt.jsに入門しています。昔から、低レイヤーの技術に興味があって最近Cコンパイラを作成し始めたのでその紹介をします。完成していないので軽く触りだけでも紹介して、楽しそうと思っていただけたら嬉しいです。iOSエンジニアとして、UIに近い箇所の実装を行う機会がとても多いのですが、個人的には低レイヤーの技術にもとても興味があります。低いレイヤーの技術を学ぶことが個人的には大事だと思っていて、それは色々な技術は低レイヤーな技術の上に積み重なるようにして存在していると思っているからです。自分の中では技術は円形に広がっていて、その中央の核にあるのが低レイヤーの技術で、表層にあるのがiOSでいうと、UIKitやその他のライブラリといった認識をしています。異なる円周上に並んだ異なった技術も、根底にある技術は同じといったことがよくあり、その根底を知っていればいるほど新しい技術へのキャッチアップが早くなるのではないかと考えてます。いえ、どこから手をつけたら良いのかよくわからずに何もできていなかったのですが、下記のコンパイラBookを見つけすごくわかりやすく書かれているためこれを機に初めて見ようと思いました。compilerbookの通りにちまちま初めてみました。現在はステップ10のreturn文をかけるところまで実装することができています。そもそも、C言語をまともに書いたことがなかったので、C言語の書き方やMakefileの書き方、ファイル分割の勘所など非常に学ぶものがたくさんあります。x_86のアセンブリの書き方、スタックマシンとして実装する方法みたいな色々なことを学べています。すごく丁寧に書かれているので興味はあるけどなかなか手をつけられないといった方にはおすすめなのかなぁと思いました。最近なかなか時間が取れていないのですが、引き続き実装を進めてセルフコンパイルするところを目標に頑張りたいと思います。