7.4.1 Hackプラットフォームでの標準的なVMマッピング、パートI / 抄訳

pp.135ff.

VMプログラム: 一連のVMコマンドから成る。ファイル名はFileName.vm。先頭の文字は大文字。VMトランスレーターがVMプログラムをアセンブリ(.asm)に変換する。

データ型: 符号つき整数のみ。true-1で表現し(訳註: 要するに全ビットが1)、false0で表現する。

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インクリメントする。