」を読んだはずなんですけど、最近アセンブラ読もうとしたら全然読めなかったので、一から復習することにしました。アメリカ人が重要なタスクに取り組んでて凄い!と書いた直後にアセンブラの復習とかシュールなんですけど、まぁ気になったら次に進めないですし仕方ないですね。コードの動作確認は32bitのCentOSで行っています。手元の64bitOSだとググって出てくる情報と色々違うので、面倒でやめました。ググったところ以下のような感じでした。$0x80がシステムコールの呼び出しで、呼び出し時のパラメータをせっせと各レジスタに積んでると言うところですね。システムコールの一覧は/usr/include/asm/unistd.hで見れるんですが、各システムコールがどんなパラメータ取るのかの1次情報がどこにあるのかは分かりませんでした。一応このページを見ると色々書いてます。Worldはちょっと複雑なので、ただ単に起動して終了するだけの以下のコードから始めるのが良いかなと思いました。$?0エントリポイント色々ググっていて.globlで指定するエントリポイントに_startが使われている場合がある事に気がつきました。ところがexit.sのmainを_startに書き換えると、リンクに失敗します。終了しましたcrt1.oに_startが定義されてるよ、とgccが文句を言っています。crt1.oって何?と思ってverboseオプションを付けて再度トライしてみると以下のような出力が得られます。数行のアセンブラを書いただけでもデフォルトで色々リンクされるんですね。その中のcrt1に_startが定義されています。終了しましたちなみにデフォルトで色々リンクされるのを、抑制するnostdlibというオプションがgccにはあります。これを指定すると、余計なものが全くリンクされずに意図通りに動作します。RunTimeの略でglibcの中に該当するコードがありました。i386アーキテクチャだとglibcのsysdeps/i386/start.Sに_startが定義されています。何をやってるかって言うと、色々初期化っぽい事をしてからmain関数を呼び出しているだけです。C言語のmain関数ってこれ由来だった訳ですね。ちなみにエントリポイントはgccの-eオプションで任意の関数名に変更できます。適当に中二病っぽい名前のエントリポイントを試しておきました。アドレッシングモードCで適当なコード書いてアセンブラ吐かせて実験していると、アドレッシングモードとか言うのが沢山ある事に気がつきます。見かけたのを列挙してみたコードを貼付けておきます。要はメモリとかレジスタへのアクセス方法なんですけど、ややこしいです。僕はindexedアドレッシングモードの見た目がイカつくて、理解するのに時間がかかりました。$0x80サブルーチンの呼び出し次はサブルーチンの呼び出しの仕組みを抑えたいということで、次のようなCのコードをコンパイルしてみます。15);}そうすると以下のようなアセンブラが得られます。add以下のコードに注目すると、古いベースポインタをスタックに退避して処理を行い、処理が終わったらベースポインタを元に戻しています。する事で、呼び出し元とサブルーチンの間で、スタックを使った引数の受け渡しを行えるわけですね。戻り値はどうやらeaxレジスタに格納するのが標準的な挙動のようです。.note.GNU-stack,"",@progbitsまぁそういうわけでアセンブラ書けないけど、頑張れば読める感じには復習できた気でいます。いつかアセンブラ解読して実作業が進む体験を出来る日を夢見て精進しきたいですね。あと中々これはという資料がオンラインで探せなかったのですが、下記のページが凄く役に立ちました。ありがとうございます。Up1個目のリンクを読んでから2個目のPDFを頑張って読んだら、かなり理解は進みそうです。