- 逆コンパイラCodeReverseを作る
291 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2015/05/05(火) 13:34:39.52 ID:p1RbtT4Y - CPU貸そうか?
|
- C言語なら俺に聞け(入門編)Part 127©2ch.net
656 :デフォルトの名無しさん[sage]:2015/05/05(火) 17:24:29.20 ID:p1RbtT4Y - >>654
アドレス
|
- 逆コンパイラCodeReverseを作る
292 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2015/05/05(火) 17:34:29.60 ID:p1RbtT4Y - CPUレジスターや仮想的なアドレス空間の任意の抽象的な場所にアクセスするための全射なアドレスを文字列で表現する。
expressed address、略してexpr_addr。 expr_addrを解決すると未知の値、シンボル、もしくは具体的な値が得られる。 また、expr_addrから型の集合への写像を作ることができる。
|
- 逆コンパイラCodeReverseを作る
293 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2015/05/05(火) 17:47:11.75 ID:p1RbtT4Y - 値の集合とシンボルの集合と型の集合が存在する。
値やシンボルはその格納場所(storage)によって類別できる。 格納場所は、スタック、ヒープ、レジスター、実行可能コード領域、その他のデータ領域などが挙げられる。 expr_addrから値やシンボルへの写像が存在する。 expr_addrから格納場所への写像が存在する。
|
- 逆コンパイラCodeReverseを作る
294 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2015/05/05(火) 18:06:31.59 ID:p1RbtT4Y - では、expr_addrの具体的な定義を決めよう。
(ea.1) expr_addrが数値ならばexpr_addrはexpr_addrが表す値の仮想アドレスを指し示す。 (ea.2) expr_addrがレジスターの名前ならばexpr_addrはそのレジスターの値が表す仮想アドレスを指す。 (ea.3) expr_addrが__cr.xxx[yy]といった文字列ならば、__cr.の後のxxxはストレージの名前であり、expr_addrはストレージxxxの(yy+1)バイト目を指し示す。 ここに、yyはexpr_addrである。 (ea.4) expr_addrに演算子+,-,*が含まれていれば、普通にexpr_addr上で足し算、引き算、掛け算を行う。
|
- 逆コンパイラCodeReverseを作る
295 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2015/05/05(火) 18:49:16.52 ID:p1RbtT4Y - x86/x64のスタックは逆向きに成長するから、__cr.stackは特別扱いしなければならない。
|
- 逆コンパイラCodeReverseを作る
296 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2015/05/05(火) 19:59:48.40 ID:p1RbtT4Y - >>295は間違い。昔はメモリーをけちるのが常だったが、
今となっては、スタックサイズ100KBくらいけちる必要はない。 たとえ失敗してもスタックサイズが可変ならば、やり直せばいい。
|
- 「コンパイラ・スクリプトエンジン」相談室16
228 :片山博文MZ ◆T6xkBnTXz7B0 []:2015/05/05(火) 23:02:55.34 ID:p1RbtT4Y - コンパイラーの品質保証は、数学で証明する時代だ!!!
Coqと数学でコンパイラーが作れる!!! http://compcert.inria.fr/compcert-C.html
|