| Bootstrap init |
| Pointers |
| 0 | 256 | SP | |
| 1 | -1 | LCL | |
| 2 | -2 | ARG | |
| 3 | -3 | THIS | |
| 4 | -4 | THAT | |
| Stack |
| 256 | ??? | | ←SP |
This is how my bootstrap code initializes the pointers before calling Sys.init().
Setting the LCL, ARG, THIS and THAT pointers to known illegal values helps identify
when a pointer is used before it is initialized.
(If you are running the NestedCall test without bootstrap code, you will not see this state.) |
|
| Entry to Sys.init() |
| Pointers |
| 0 | 261 | SP | |
| 1 | 261 | LCL | |
| 2 | 256 | ARG | |
| 3 | -3 | THIS | |
| 4 | -4 | THAT | |
| Stack |
| 256 | * | Return IP | ←ARG |
| 257 | -1 | Saved LCL | |
| 258 | -2 | Saved ARG | Sys.init |
| 259 | -3 | Saved THIS | frame |
| 260 | -4 | Saved THAT | |
| 261 | ??? | | ←LCL, SP |
This is how NestedCall.tst initializes the pointers and stack. This is what RAM looks
like after my bootstrap calls Sys.init().
(If your VM translation includes the bootstrap, the -1 through -4 values may be
different if your bootstrap initializes them.) |
|
| Entry to Sys.main() |
| Pointers |
| 0 | 266 | SP | |
| 1 | 266 | LCL | |
| 2 | 261 | ARG | |
| 3 | 4000 | THIS | |
| 4 | 5000 | THAT | |
| Stack |
| 256 | * | Return IP | |
| 257 | -1 | Saved LCL | |
| 258 | -2 | Saved ARG | Sys.init |
| 259 | -3 | Saved THIS | frame |
| 260 | -4 | Saved THAT | |
| 261 | * | Return IP | ←ARG |
| 262 | 261 | Saved LCL | |
| 263 | 256 | Saved ARG | Sys.main |
| 264 | 4000 | Saved THIS | frame |
| 265 | 5000 | Saved THAT | |
| 266 | ??? | | ←LCL, SP |
|
| After Sys.main() prologue |
| Pointers |
| 0 | 271 | SP | |
| 1 | 266 | LCL | |
| 2 | 261 | ARG | |
| 3 | 4000 | THIS | |
| 4 | 5000 | THAT | |
| Stack |
| 256 | * | Return IP | |
| 257 | -1 | Saved LCL | |
| 258 | -2 | Saved ARG | Sys.init |
| 259 | -3 | Saved THIS | frame |
| 260 | -4 | Saved THAT | |
| 261 | * | Return IP | ←ARG |
| 262 | 261 | Saved LCL | |
| 263 | 256 | Saved ARG | Sys.main |
| 264 | 4000 | Saved THIS | frame |
| 265 | 5000 | Saved THAT | |
| 266 | 0 | local 0 | ←LCL |
| 267 | 0 | local 1 | |
| 268 | 0 | local 2 | |
| 269 | 0 | local 3 | |
| 270 | 0 | local 4 | |
| 271 | ??? | | ←SP |
The function prologue is the assembly language code generated for the
"function" VM command.
|
|
| Entry to Sys.add12(123) |
| Pointers |
| 0 | 277 | SP | |
| 1 | 277 | LCL | |
| 2 | 271 | ARG | |
| 3 | 4001 | THIS | |
| 4 | 5001 | THAT | |
| Stack |
| 256 | * | Return IP | |
| 257 | -1 | Saved LCL | |
| 258 | -2 | Saved ARG | Sys.init |
| 259 | -3 | Saved THIS | frame |
| 260 | -4 | Saved THAT | |
| 261 | * | Return IP | |
| 262 | 261 | Saved LCL | |
| 263 | 256 | Saved ARG | Sys.main |
| 264 | 4000 | Saved THIS | frame |
| 265 | 5000 | Saved THAT | |
| 266 | 0 | local 0 | |
| 267 | 200 | local 1 | |
| 268 | 40 | local 2 | |
| 269 | 6 | local 3 | |
| 270 | 0 | local 4 | |
| 271 | 123 | argument 0 | ←ARG |
| 272 | * | Return IP | |
| 273 | 266 | Saved LCL | Sys.add12 |
| 274 | 261 | Saved ARG | frame |
| 275 | 4001 | Saved THIS | |
| 276 | 5001 | Saved THAT | |
| 277 | ??? | | ←LCL, SP |
|