制御構造は、プログラムの『流れ』を形作るための基本的な機能です。プログラムの流れを理解するためには、CPUが何をしているかを知る必要があります。 どのような言語で書いても、プログラムは最終的に機械語(マシン語)になります。そこで今回は、制御構造を実現する命令if、for、whileが機械語のレベルでどのような形となっているのかを見ていくことにします。 機械語はCPUの理解できる唯一の言葉ですが、その実体は2進数──0と1の羅列なので、簡単に把握することはできません。アセンブリ言語に置き換えることにしましょう。高級言語のソースコードをアセンブリ言語に置き換えると、CPUの動きがよく見えてきます。 長谷川 裕行(はせがわ ひろゆき) 大阪芸術大学 写真学科で映像文化をテーマに研究、講師を務める一方でライター、テクニカルアドバイザーとしても第一線で活躍中。 実践的な業務アプリケーションの知識を生
のように書けば関数を呼び出せるので、関数の呼び出しについてわざわざ説明するまでもありません。 ですが、アセンブリ言語では、そのような簡単な書き方はできません。 引数の準備をしたり、戻り値の渡し方を決めたりする必要があります。 このページでの目標は、アセンブリ言語で関数を読み書きできるようになることです。 まず引数の格納に使われるスタックについて復習してから、call・ret命令、ローカル変数の確保、leave命令、 関数呼び出しのルールである呼出規約について説明します。 説明の途中に、ブラウザで動く簡易アセンブラがあるので、ステップ実行してみてください。 スタックの内容がビジュアルに表示されるので、言葉だけの説明より理解しやすいと思います。 アセンブリ言語の表記には、Intel記法とAT&T記法がありますが、ここではIntel記法を使います。 コードは32ビットの環境であるとします。 関数
がっつりとやるつもりはありませんが、もしかしたら読む必要が出るかもしれないので少しだけお勉強。 もともと仕組みを知ることが好きなので読み始めると結構面白いです。 (ほんとはarmのほうが知識としては必要なんだけど、それはまた後日調べる) はじめに 今回まとめているのはx86とx86_64アーキテクチャに関するものです。 armなどはまた異なったものとなります。 また、構文もいくつかあるようで、それぞれ AT&T構文、 Intel構文というようです。 構文の違い %raxなどのように、レジスタに%がついていたりするのはAT&T構文です。 ついていないものはIntel構文です。 また、セクションの定義など細かいところで色々と差異があるようです。 ソース・ディスティネーション 上記構文の中で特に覚えておかないと混乱するのがこの「ソース」と「ディスティネーション」の順番です。 例えば、raxレジス
ベースポインタは,現在実行中のスタックフレーム (アクティブなフレーム) の底 (図2の通り正確には底の少し上) を指すレジスタです.以前の BP の値というのは,呼出し側の関数のベースポインタの値で,関数終了時にベースポインタにコピーされます.また,リターンアドレスとは,関数の処理終了後に次に実行するプログラムのアドレスのことです. Cプログラマの必読書 たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください. C実践プログラミング 第3版 C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです. 文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く