命令とデータが区別されることなくメモリに保存されるというのがフォン・ノイマン型の主要な機能としてあげられます。そのため、プログラマが命令とデータを簡易的に区別できるように用いられるのがセクションです。.dataはグローバル変数を記述するためのセクションであることを意味します。.textは命令を記述するセクションを意味します。セクションは機械語にコンパイルされず、コンパイル時の補助的な役割を担います。このように直接機械語に変換されず、変換処理を制御する要素をディレクティブと呼びます。これはラベルと呼ばれます。ラベルを用いることで、プログラマがわかりやすい名前をアドレス値に付与することができます。高級言語の変数に似ている概念ですが、アセンブリでは変数や手続きが厳密に区別されないため、ラベルという言葉を用いるのが一般的だそうです。Lineまた、_startもラベルです。アセンブリは複数のファイルに分けて書くことが可能ですが、どこの処理から始めるかを宣言して上げる必要があります。その時に用いられるのがこの_startラベルです。main()関数みたいなものですかね。db同じく二行目のdbについて。同様にディレクティブの一種です。ディレクティブはバイトデータを初期化するために用いられます。コードと、改行を示す特殊コードの10が、messsageラベルに格納されます。他にもワードデータを初期化するためのdwやダブルワードを初期化するためのddなどが存在します。詳しくは以下を参照してください。_startにあるglobalです。globalもsectionやdbと同じくディレクティブであり、プログラムの実行を開始するアドレスを指定します。_startはラベルであり、8行目以下の命令群が格納されています。1から実行されることを意味します。命令編ここまでの解説で、とりあえず各コマンドの意味は掴めてきたと思います。次に、プログラムの主役である、命令部分を詳しく見て行きましょう。命令部分のみを再掲します。rdisyscall文法編と同様に一つずつ紐解いて行きます。ある値をレジスタかメモリに書き込むために用いる命令です。高級言語で「代入」として扱っている操作が近いです。以下のルールが存在します。メモリからメモリへの移動はできない。移動元と移動先のオペランドのサイズが同じでなければならない。使って、システムコールやラベルなどが示す様々な値をレジスタに格納します。システムでシステムコールを実行するために用いる命令です。システムコールには様々な種類が存在し、一意に値が定義されています。60がシステムコールを表しています。よって、raxレジスタに格納されています。どちらもraxレジスタに値を格納しているのは、システムコールを実行するために以下の手順を踏む必要があるからです。レジスタにシステムコールの番号を入れるシステムコールが使用する引数は、rdi,rsi,rdx,r10,r8,r9のいずれかに格納する(これ以上の引数、つまり6個以上の引数を受け取ることはできない)syscall命令を実行する。一度ハローワールドのプログラムを見てみましょう。以上のように、システムコールを実行する手順をちゃんと踏んでいたことがわかると思います。システムコールのドキュメントを読んでみます。このドキュメントの通りに先ほどのプログラムをみてみると、以下の操作を行なっていたことがわかります。world!」をターミナルに表示するための命令になります。まとめそれではここまで解説したことを念頭におきながらもう一度、プログラムを眺めてみます。.dataセクション。.textセクション。システムコールを実行うるさいくらいコメントを記述しましたが、これでわからない部分がなくなりました。まとめ前記事で記述したハローワールドのアセンブリを解説しました。前回の記事で更新してなかったら死んでるとかどうの言ってましたが、生きてました。»Profile表参道で働く、フロントエンドエンジニア普段はTypeScriptでReact&Redux書いてます。機械学習最近全くやってないけど、復活しようと企んでる。(2)Archiveはてなブログをはじめよう!ket-30さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。