-
Notifications
You must be signed in to change notification settings - Fork 0
Memory Representation
skyrabbit edited this page May 12, 2020
·
9 revisions
エンディアンの違いは注意すべきである。TODO buildスクリプトで識別しておく
表現は2つ用意する(未実装)
- inline: 空間的な制限あり 高速
- unlimited: 空間的な制限なし 低速
32 bitを上位から順に8 bitずつopcode, operand0, operand1, operand2として扱う
/* C++ */ struct { uint8_t, int8_t, int8_t, int8_t };
/* Rust */ (u8, i8, i8, i8)
上のようにbyteごとに分割して宣言することでエンディアンの違いを吸収できる(はずである)。
特記事項はない clang++と同様の扱いである
- true: 1
- false: 0
IEEE 754に基づいたメモリ表現である
s eeeeeeee fffffffffffffffffffffff
- s: sign
- e: exponent
- f: fraction
0を表すバイトで終わる連続する文字で表す
- 静的: data
- 動的: heap
引数、ローカル変数はスタックに格納される
スタックトップ |
---|
戻りアドレス |
.. |
ローカル変数2 |
ローカル変数1 |
古いベースポインタ |
引数1 |
引数2 |
.. |
新しいベースポインタは古いベースポインタを指すので
- n番目の引数: ベースポインタ-n
- n番目のローカル変数: ベースポインタ+n
でアクセスできる。
戻り値は実装されていないが、戻りアドレスより1つ上に「戻り値を代入するレジスタ」の添字をpushするか、予約されたレジスタに戻り値を代入する、という実装になるだろう。
ヒープ領域の先頭からのオフセットを整数と同様に表す
いくつかの方法を提案しておく。適切に使い分けてほしい
- メモリを割り当てない
- 0または-1で表す
- bit flag法を用いてnil flagを立てる
連続するヒープ領域を用いて表す
- フィールド: ABIに基づいたデータ表現で表す
- メソッド: コンパイラが静的ディスパッチする
連続するヒープ領域を用いて表す
- 静的: data
- 動的: heap