Skip to content

Latest commit

 

History

History
75 lines (51 loc) · 2.23 KB

MEMO.md

File metadata and controls

75 lines (51 loc) · 2.23 KB

メモリセグメントマッピング参考

バッファオーバーフローを理解するための基礎知識

subroutine calling

サブルーチンは、手続き型言語で「サブルーチン」、「プロシージャ」、「関数」、オブジェクト指向言語では「メソッド」とよばれる。

「ビルトインコマンド」は ユーザが定義した

リターンされるとスタックに結果がプッシュされる。

call xxx を見つけると、returnアドレスにcallアドレスの次の値をpopする.

@SP
D=M
@RETURN
M=D+1

label xxx 現在の位置をラベル付けする。 ラベルのスコープはそれが定義された関数内。 xxxは、アルファベット、数字、アンダースコア(_)、ドット(.)、コロン(;)を用いることができる。 数字から始まることは出来ない。

goto xxx 無条件の移動命令 xxxでラベル付けされた場所からプログラムの実行を開始する。 移動先は同じ関数内に限られる。

if-goto xxx 条件付きの移動。 スタックの最上位の値をポップし、その値が0でなければ、xxxでラベル付けされた場所位からプログラムの実行を開始する。その値が0であれば、プログラムの次のコマンドが実行される。 移動先は同じ関数内に限られる。

実装

command segment i | | | function f n n個のローカル変数をもつfという名前の関数を定義。 | | | call f m fという関数を呼ぶ。個々で、m個の引数は呼び出し側によってスタックにプシュ済み。 | return 呼び出し元へリターンする。

関数呼び出しプロトコル

push const 10 push const 10 call foo 2

function foo 2

グローバルスタック

関数が呼ばれるごとにグローバルスタックへ新しいブロックが追加される。 グローバルスタックは以下の4つの要素から構成される。

  • 引数
  • ポインタ
  • ローカル変数
  • ワーキングスタック