7.4.1 Hackプラットフォームでの標準的なVMマッピング、パートI / 抄訳
pp.135ff.
VMプログラム: 一連のVMコマンドから成る。ファイル名はFileName.vm。先頭の文字は大文字。VMトランスレーターがVMプログラムをアセンブリ(.asm)に変換する。
データ型: 符号つき整数のみ。trueは-1
で表現し(訳註: 要するに全ビットが1
)、falseは0
で表現する。
RAMの使用方法: 16ビット×32Kワード。先頭のアドレス空間は下のように利用する。
RAMアドレス: 用法
0~15: 16個の仮想レジスタ。用途は下記。
16~255: 静的変数。
256~2047: スタック。
名前: ロケーション: 用途
SP: RAM[0]: スタックポインタ。スタックの最上位値の格納されているメモリーアドレスの直後のメモリーアドレス。
LCL: RAM[1]: local
セグメントのベースアドレス。
ARG: RAM[2]: arument
セグメントのベースアドレス。
THIS: RAM[3]: this
セグメントのベースアドレス。
THAT: RAM[4]: that
セグメントのベースアドレス。
TEMP: RAM[5~12]: temp
セグメントを保持しておく。
R13: RAM[13]: VMトランスレーターで生成されるアセンブリコードが変数を必要とする場合は、このレジスタを使うことができる。
R14: RAM[14]: 同上。
R15: RAM[15]: 同上。
どれかメモリーセグメントの「ベースアドレス」と言った場合、それはホストRAMにおける物理的アドレスのこと。
VMトランスレーターは、そうしたアドレスを直接参照することはなく、ポインタ名を使ってメモリーを操作します。たとえばDレジスタの値をスタックにプッシュする場合を考えてみましょう。この処理は
RAM[SP++]=0
というロジックで実装できます。Hackアセンブリで表現すると下のようになります。
@SP // RAM[SP]に格納されている値(すなわち最後尾の空きアドレス)を、 A=M // 読み出して、 M=D // そのアドレス(すなわちRAM[RAM[SP]])にDレジスタの値を格納して、 @SP M=M+1 // RAM[SP]に格納されている値(すなわち最後尾の空きアドレス)を1インクリメントする。