ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

L8プログラミング (5)

2013-07-25 18:34:48 | 暮らし
IT.pdf
IT-s.pdf
IT-e.pdf

記事一覧

                       引数と自動変数をもつ関数

IT-e.pdf に高級言語のコンパイルに関する説明を追加しました.非常に簡単な例ですが,引数や自動変数(静的でない局所変数)をスタック上に置くことの実態が分かると思います.

メモ:以下のメモを読む前に [%33B] に示した資料
[1] コールスタック - Wikipedia
  http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF
[2] 呼出規約 - Wikipedia
  http://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84
[3] HACK#9 デバッグに必要なスタックの基礎知識(685KB)
  http://www.oreilly.co.jp/editors/debug_hacks_09.pdf
を見てください.また次の資料も以下で引用します.
------------------
[4] X86アセンブラ/x86アーキテクチャ - Wikibooks
  http://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/x86%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3
[5] Intel 8086 - ウィキペディア - Wikipedia
  http://ja.wikipedia.org/wiki/Intel_8086
  英語版:http://en.wikipedia.org/wiki/Intel_8086 (サンプルプログラムあり)
------------------
(1) [1] で説明されているフレームポインタの具体例が [3] のサンプルプログラムの ebp(bp を32ビット化したレジスタ)です.
(2) i8086 の時から [4] の英語版に書かれている"mov ax,[bx + di + 10]" のようなアドレス指定をできましたが,[5] では紹介されていません.レジスタを2個使うとスタック上にある構造体配列のメンバも分かりやすくなります.
(3) int sum(int i, int k){return i+k;} は例えば
    SUM   LD    R0, 1, R3
          ADD   R0, 2, R3
          RET
前記の [3] の例でも eax に戻り値を設定していますが,スタック上に置くように定めてもよい.
(4) [%32] の「LDA   R3, -2, R3」の処理を RET 側で行うには,例えば
    RET   MACRO  X
          LDA    R3, X, R3
          RET
          ENDM 
これを用いると RET 側の「LDA   R3, 1, R3」も X に統合できます.