ページ2018.04.16プログラミングアセンブリ言語に入門しようmmmuserMMMバックエンドエンジニアの柳沼です。Worldを出力してみることで、アセンブリ言語の基礎を学んでみようと思います。今回はアセンブラにnasmを採用します。バージョンは2.0.0以上であることを推奨します。筆者の環境は以下のとおりです。2018また、筆者のマシンのCPU情報は以下のとおりです。(4コアなため4行表示されています。2.00GHzLinuxディストリビューションはGentooを使用しています。(darwinでもたぶんできると思うので頑張ってください。)ディストリ及びカーネルのバージョンは以下のとおりです。Worldまとめセクション本エントリではアセンブリの全ての文法には触れません。Worldの出力に必要な知識に絞って説明していきます。データセクションデータセクションは、データを格納するために使用します。以下のような書き方をします。1バイト分のメモリを確保することを意味します。world!"と同じようなことです。テキストセクションテキストセクションには、実際の処理を記述します。テキストセクションは、以下のように開始します。プログラムのエントリーポイントになります。ラベル(関数の開始位置みたいなもの)として使用します。処理の文法は以下のとおりです。セットする、という意味になります。レジスタレジスタとは要するに記憶領域です。メモリのように、データを保存することが可能です。メモリよりも高速に動作し、CPUの上(物理)にあります。本エントリで登場するレジスタは、x64環境のものであることに留意してください。(x86とかだと名前が違います。)レジスタは(物理的に)複数存在しており、それぞれ名前がついています。今回使用するのは以下のレジスタです。Worldはできます。コードを見てみましょう。World以下のようなコードになります。syscallデータセクションでは文字列を宣言しているだけです。1は、raxに1を入れています。システムコール番号はLinuxカーネルのsyscall_64.tblから参照できます。12については、前述の通り、引数を詰めています。引数を知るために、manを見てみましょう。count);引数が3つ必要なことがわかります。ファイルディスクリプタです。標準出力したいので、1をセットします。データのサイズを指定します。syscall上記で、今のレジスタの状態を基にシステムコールを発行します。上記3つの引数を基に、raxレジスタに詰めているシステムコール(sys_write)を発行してくれます。0syscallこちらは、exit(0)を行っています。システムコールの60番はexitで、引数は終了コードになります。実行は、以下のように行います。表示されれば勝ちです。Worldを通して、レジスタの使い方、システムコール発行の流れを追ってみました。システムコールについては、こういうサイトを使えば使うべきレジスタも教えてくれるので便利です。専門性や実績を認定された公式パートナーです。ウェブサービス株式会社(DWS)公式ブログ記事URLをコピーしました。