Recommended
PDF
SECDマシン 実装と動きとその他もろもろについて
PDF
PPT
機械語の動作トレース による処理装置のはたらきの説明スライド
PDF
PDF
PDF
PPTX
PDF
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
PDF
PDF
ODP
PDF
2011.09.18 v7から始めるunix まとめ
PPT
PDF
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
PDF
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
PDF
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
PDF
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
PDF
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
PPTX
PDF
PDF
PPT
PDF
Step-Oriented Programming による任意コード実行の可能性
PDF
PPTX
PPTX
PDF
More Related Content
PDF
SECDマシン 実装と動きとその他もろもろについて
PDF
PPT
機械語の動作トレース による処理装置のはたらきの説明スライド
PDF
PDF
PDF
PPTX
PDF
セキュアVMの構築 (IntelとAMDの比較、あともうひとつ...) - AVTokyo 2009
Similar to 08
PDF
PDF
ODP
PDF
2011.09.18 v7から始めるunix まとめ
PPT
PDF
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
PDF
PDF
【学習メモ#4th】12ステップで作る組込みOS自作入門
PDF
Lisp Meet Up #27, 8-bit PIC マイコン用ネイティブコンパイラの作成(後編)
PDF
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
PDF
V6 Interpreter (Nagoya Geek Bar 2011-05-02)
PPTX
PDF
PDF
PPT
PDF
Step-Oriented Programming による任意コード実行の可能性
PDF
PPTX
PPTX
PDF
08 1. 2. 3. 4. 5. 6. 7. 8. プログラムフロー制御
if (cond)
s1
else
s2
...
while (cond)
s1
...
~ (cond)を計算するVMコード
if-goto L1
s1を計算するVMコード
goto L2
label L1
s2を計算するVMコード
...
label L1
~ (cond)を計算するVMコード
if-goto L2
s1を計算するVMコード
goto s1
label L2
...
高水準言語におけるフロー制御 疑似VMコード
「label」
「goto」
「if-goto」
「スタックの最上位に格納され
るブール値」
を使って、プログラムのフロー
制御を実現できる
9. 10. サブルーチン
• e.g. ビルトインのaddとサブルーチンpowerの例
– 引数をとり結果を返すという点では、同じ見た目
• 違いは「call」を用いるか否かという点だけ
// x+2
push x
push 2
add
...
// x^3
push x
push 3
call power
...
// (x^3+2)^y
push x
push 3
call power
push 2
add
push y
call power
...
// 累乗(power)関数
// 第1引数が第2引数だけ累乗
// される。power(2, 3)は
// 2の3乗を計算する。
function power
// (コードは省略)
push result
return
11. 12. 13. 14. サブルーチン呼び出しとスタックの状態
start a
start b
start c
start d
end d
end c
start d
end d
end b
start c
start d
end d
end c
end a
subroutine a:
call b
call c
...
subroutine b:
call c
call d
...
subroutine c:
call d
...
subroutine d:
...
スタックの状態
bフレーム
cフレーム
dフレーム
aフレーム
dフレーム
cフレーム
dフレーム
コード フロー
15. まとめ:call xxx の実装
1. 呼び出し側のフレームをスタック上に格納
2. 呼び出された側(xxx)のローカル変数のための
メモリ領域を確保
3. シンボル名xxxをメモリアドレスへ変換して、そ
のアドレスへ移動
16. まとめ:return の実装
1. 「call xxx」に出くわす度、callコマンドの次のコマ
ンドのアドレスをスタックにプッシュ
2. (xxxを実行)
3. returnコマンドに出くわしたときに、スタックから
リターンアドレスをポップして、そのアドレスへ
gotoで移動する
17. 18. 19. 20. 21. 22. 23. 24. 関数呼び出しプロトコル
• 関数を呼び出される側の視点
1. 関数の実行が開始すると、
• argumentセグメントが呼び出し側から渡された実際の引数の値に初期化される
• local変数のセグメントが割り当てられ、0に初期化
• staticセグメントは、そのVMファイルのstaticセグメントに属する
• ワーキングスタックは空
• this、that、pointer、tempセグメントは最初は未定義
2. リターンされる前に、呼び出された関数はスタック上に値をプッシュしなければならない
25. 26. 27. 28. 29. 関数呼び出しコマンドのVM実装 (p.179)
VMコマンド VM実装によって生成される(疑似)コード
call f n
(n個の引数がスタックにプッシュされた後に
関数fが呼ばれる)
push return-address // (以下のラベル宣言を用いる)
push LCL // 関数の呼び出し側のLCLを格納する
push ARG // 関数の呼び出し側のARGを格納する
push THIS // 関数の呼び出し側のTHISを格納する
push THAT // 関数の呼び出し側のTHATを格納する
ARG = SP-n-5 // ARGを別の場所に移す(n=引数の数)
LCL = SP // LCLを別の場所に移す
goto f // 制御を移す
(return-address) // リターンアドレスのためのラベルを宣言する
function f k
(k個のローカル変数を持つ関数fを宣言す
る)
(f) // 関数の開始位置のためのラベルを宣言する
repeat k times: // k=ローカル変数の個数
push 0 // すべてを0で初期化する
return
(関数からのリターン)
FRAME = LCL // FRAMEは一時変数
RET = * (FRAME-5) // 一時変数に保存されているリターンアドレスを取得する
*ARG = POP() // 関数の呼び出し側のために、関数の戻り値を別の場所へ移す
SP = ARG+1 // 呼び出し側のSPを戻す
THAT = * (FRAME-1) // 呼び出し側のTHATを戻す
THIS = * (FRAME-2) // 呼び出し側のTHISを戻す
ARG = * (FRAME-3) // 呼び出し側のARGを戻す
LCL = * (FRAME-4) // 呼び出し側のLCLを戻す
goto RET // リターンアドレスへ移動する(呼び出し側のコードへ戻る)
30. アセンブリ言語のシンボル (p.180)
シンボル 使用法
SP、LCL、ARG、THIS、THAT SPはスタックの最上位の場所を指す。残りのシンボルについては、仮想セグメントであるlocal、argument、
this、thatのベースアドレスを指す
R13-R15 どのような目的でも使うことができる
Xxx.j Xxx.vmというVMファイルに存在するスタティック変数jはアセンブリのシンボルにおいてXxx.jに変換され
る。その後に続くアセンブリ処理では、そのシンボル変数は、HackアセンブラによってRAM領域に割り当
てられる
functionName$label Xxx.vmというVMファイルに存在するラベルコマンドがあれば、VM実装はグローバル(プログラム全体)で
ユニークな"f$b"というシンボルを生成する。
ここでfは関数名であり、bはVM関数コード内のラベル記号である。
「goto b」や「if-goto b」などのVMコマンドが対象の言語に変換されると、ラベルの指定には「b」のかわり
に「f$b」を使わなければならない
(functionName) fというVM関数を定義すると、「f」というシンボルが生成され、そのシンボルはその関数の開始位置を指
す
return-address VM関数呼び出しは、変換コードにユニークなシンボルを挿入し、このユニークなシンボルはリターンアド
レスとして、つまり関数呼び出しの次のコマンドがあるメモリ位置として機能する
31. 32. 33. 34. 35. 36. 37. 38. 実装: 関数呼び出しコマンド
// FRAME =LCL
@LCL
D=M
@R13
M=D
// RET = *(FRAME-5)
@5
A=D-A
D=M
@R14
M=D
// 続く・・・
return
.vm .asm // *ARG = POP()
@ARG
D=M
@R15
M=D
@SP
AM=M-1
D=M
@R15
A=M
M=D
// 続く・・・
// SP = ARG + 1
@ARG
D=M
@SP
M=D+1
// THAT = *(FRAME-1)
@R13
AM=M-1
D=M
@THAT
M=D
// THIS = *(FRAM-2) ...
// (略)
39. 40. 41. 実装: 関数呼び出しコマンド
// push return-address
@RET_ADDRESS_{count}
D=A
@SP
A=M
M=D
@SP
M=M+1
// push LCL
@LCL
D=M
@SP
call functionName numArgs
.vm .asm A=M
M=D
@SP
M=M+1
// push ARG ...
...
(略)
...
// ARG = SP-n-5
@SP
D=M
@5
D=D-A
// 実際は整数
@{numArgs}
D=D-A
@ARG
M=D
// LCL = SP
@SP
D=M
@LCL
M=D
// goto f
(略)
...
42.