C LANGUAGE TECHNOLOGY

【C言語】スタックとは【x64のアセンブリ言語で解説】

悩んでいる人

C言語のスタックを教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

スタック

スタックとは,データを後入れ先出し(LIFO:Last In First Out)で保持するデータ構造です.

スタックには,2つの基本操作のプッシュ(push)とポップ(pop)があります.

pushは指定されたデータをスタックの先頭に追加し,既存のデータはその下にそのまま保持します.

これに対して,popはスタックの現在の先頭のデータを削除し,そのデータを返します.

スタックの利用例は以下になります.

  • 関数の呼び出し前に仮引数の格納
  • 関数の呼び出し後に呼び出し元のレジスタの退避や復帰

他のデータ構造を知りたいあなたはこちらからどうぞ.

C言語 リスト
【C言語】連結リストとは【片方向リスト,双方向リスト,双方向循環リスト】

こういった悩みにお答えします. こういった私から学べます. 目次1 連結リスト2 C言語のリスト2.1 片方向リスト2.2 双方向リスト2.3 双方向循環リスト3 リストの実例:Linuxカーネル3. ...

続きを見る

C言語 キュー
【C言語】キューとは【優先度キューの二項ヒープを紹介】

こういった悩みにお答えします. こういった私から学べます. 目次1 キュー2 C言語のキュー3 C言語の優先度キューの例「二項ヒープ」4 まとめ キュー キューとは,データを先入れ先出し(First ...

続きを見る

C言語のスタック

C言語によるスタックのコードは以下になります.

スタックの動作がわかります.

実行結果は以下になります.

スタックは後入れ先出しでデータを操作していることがわかります.

x64の命令セットアーキテクチャでスタックを操作するpush/pop命令

x64の命令セットアーキテクチャでは,スタックのpush/pop操作を行うpush/pop命令があります.

C言語からアセンブリ言語のファイルを出力する場合,GCCでは-Sオプションを利用します.

C言語のstack.cファイルからアセンブリ言語のstack.sファイルを作成し,catコマンドで表示する方法は以下になります.

stack.sの中身は以下になります.

例えば,5~33行目のinit関数では,9行目にpushq命令(push命令の64ビット版),28行目にpopq命令(pop命令の64ビット版)を実行していることがわかります.

まとめ

C言語のスタックを紹介しました.

具体的には,C言語のスタックと,x64のアセンブリ言語におけるpush/pop命令の実例を解説しました.

スタックは,主に関数の呼び出しの時に利用されるので覚えておきましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール4社で自分に合うスクールを見つけましょう.

-C LANGUAGE, TECHNOLOGY
-, , , , ,