nand2tetris/projects/08/FunctionCalls/NestedCall/NestedCallStack.html

306 lines
19 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>NestedCall.tst &mdash; Stack Frames</title>
<style type="text/css">
.stack {border-collapse:collapse; font-size:80%;}
.stack td {padding-left:.25em;padding-right:.25em;white-space:nowrap;}
.stack td:first-child {text-align:right;}
.stack td:first-child + td {text-align:right;}
.stack td:first-child + td + td {text-align:left;}
.stack td:first-child + td + td + td {text-align:left;}
.stack .reg {border-left:1px solid; border-right:1px solid;}
.stack .reg th {border:1px solid;}
.stack .stack {border-left:1px solid; border-right:1px solid;}
.stack .stack th {border:1px solid;}
.stack .tos {border-left:1px solid; border-right:1px solid;border-bottom:1px solid;}
.stack .frame {border-left:1px solid; border-right:1px solid;}
.stack .frame td:first-child + td {border-left:1px solid;}
.stack .frame td:first-child + td + td {border-right:1px solid;}
.stack .framet {border-left:1px solid; border-right:1px solid;}
.stack .framet td:first-child + td {border-left:1px solid;border-top:1px solid;}
.stack .framet td:first-child + td + td {border-right:1px solid;border-top:1px solid;}
.stack .bframe {border-left:1px solid; border-right:1px solid;}
.stack .bframe td:first-child + td {border-left:2px solid;}
.stack .bframe td:first-child + td + td {border-right:2px solid;}
.stack .bframet {border-left:1px solid; border-right:1px solid;}
.stack .bframet td:first-child + td {border-left:2px solid;border-top:2px solid;}
.stack .bframet td:first-child + td + td {border-right:2px solid;border-top:2px solid;}
.stack .bframeb {border-left:1px solid; border-right:1px solid;}
.stack .bframeb td:first-child + td {border-left:2px solid;border-bottom:2px solid;}
.stack .bframeb td:first-child + td + td {border-right:2px solid;border-bottom:2px solid;}
.stack .note td {padding-left:.5em;padding-right:.5em;white-space:normal;text-align:justify;}
.stack .fid {font-style:italic}
.master {width: 10%;}
.master td {vertical-align:top;padding-right:.5em; }
</style>
</head>
<body>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<table class="master">
<tr>
<td>
<table class="stack">
<tr><th colspan="4">Bootstrap init</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>256</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>-1</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>-2</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>-3</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>-4</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="tos"><td>256</td><td>???</td><td></td><td>&larr;SP</td></tr>
<tr class="note"><td colspan="4"><br>
This is how my boot&shy;strap code initial&shy;izes the pointers before calling Sys.init().
<p>
Setting the LCL, ARG, THIS and THAT point&shy;ers to known illegal values helps identify
when a pointer is used before it is initial&shy;ized.
<p>
(If you are running the NestedCall test with&shy;out boot&shy;strap code, you will not see this state.)</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">Entry to Sys.init()</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>261</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>261</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>256</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>-3</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>-4</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="bframet"><td>256</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="bframe"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframeb"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="tos"><td>261</td><td>???</td><td></td><td>&larr;LCL, SP</td></tr>
<tr class="note"><td colspan="4"><br>
This is how NestedCall.tst initial&shy;izes the pointers and stack. This is what RAM looks
like after my boot&shy;strap calls Sys.init().
<p>
(If your VM trans&shy;lation includes the boot&shy;strap, the -1 through -4 values may be
different if your boot&shy;strap initial&shy;izes them.)</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">Entry to Sys.main()</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>266</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>266</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>261</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4000</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5000</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="framet"><td>256</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="frame"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="bframet"><td>261</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>262</td><td>261</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>263</td><td>256</td><td>Saved ARG</td><td class="fid">Sys.main</td></tr>
<tr class="bframe"><td>264</td><td>4000</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframeb"><td>265</td><td>5000</td><td>Saved THAT</td><td></td></tr>
<tr class="tos"><td>266</td><td>???</td><td></td><td>&larr;LCL, SP</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">After Sys.main() prologue</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>271</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>266</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>261</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4000</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5000</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="framet"><td>256</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="frame"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="bframet"><td>261</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>262</td><td>261</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>263</td><td>256</td><td>Saved ARG</td><td class="fid">Sys.main</td></tr>
<tr class="bframe"><td>264</td><td>4000</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframe"><td>265</td><td>5000</td><td>Saved THAT</td><td></td></tr>
<tr class="bframe"><td>266</td><td>0</td><td>local 0</td><td>&larr;LCL</td></tr>
<tr class="bframe"><td>267</td><td>0</td><td>local 1</td><td></td></tr>
<tr class="bframe"><td>268</td><td>0</td><td>local 2</td><td></td></tr>
<tr class="bframe"><td>269</td><td>0</td><td>local 3</td><td></td></tr>
<tr class="bframeb"><td>270</td><td>0</td><td>local 4</td><td></td></tr>
<tr class="tos"><td>271</td><td>???</td><td></td><td>&larr;SP</td></tr>
<tr class="note"><td colspan="4"><br>
The <i>function prologue</i> is the assembly language code generated for the
"function" VM command.
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">Entry to Sys.add12(123)</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>277</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>277</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>271</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4001</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5001</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="framet"><td>256</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="frame"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="framet"><td>261</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>262</td><td>261</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>263</td><td>256</td><td>Saved ARG</td><td class="fid">Sys.main</td></tr>
<tr class="frame"><td>264</td><td>4000</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>265</td><td>5000</td><td>Saved THAT</td><td></td></tr>
<tr class="frame"><td>266</td><td>0</td><td>local 0</td><td></td></tr>
<tr class="frame"><td>267</td><td>200</td><td>local 1</td><td></td></tr>
<tr class="frame"><td>268</td><td>40</td><td>local 2</td><td></td></tr>
<tr class="frame"><td>269</td><td>6</td><td>local 3</td><td></td></tr>
<tr class="frame"><td>270</td><td>0</td><td>local 4</td><td></td></tr>
<tr class="bframet"><td>271</td><td>123</td><td>argument 0</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>272</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="bframe"><td>273</td><td>266</td><td>Saved LCL</td><td class="fid">Sys.add12</td></tr>
<tr class="bframe"><td>274</td><td>261</td><td>Saved ARG</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframe"><td>275</td><td>4001</td><td>Saved THIS</td><td></td></tr>
<tr class="bframeb"><td>276</td><td>5001</td><td>Saved THAT</td><td></td></tr>
<tr class="tos"><td>277</td><td>???</td><td></td><td>&larr;LCL, SP</td></tr>
</table>
</td>
</tr></table>
<p>
<table class="master">
<tr>
<td>
<table class="stack">
<tr><th colspan="4">Before Sys.add12() return</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>278</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>277</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>271</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4002</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5002</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="framet"><td>256</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="frame"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="framet"><td>261</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>262</td><td>261</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>263</td><td>256</td><td>Saved ARG</td><td class="fid">Sys.main</td></tr>
<tr class="frame"><td>264</td><td>4000</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>265</td><td>5000</td><td>Saved THAT</td><td></td></tr>
<tr class="frame"><td>266</td><td>0</td><td>local 0</td><td></td></tr>
<tr class="frame"><td>267</td><td>200</td><td>local 1</td><td></td></tr>
<tr class="frame"><td>268</td><td>40</td><td>local 2</td><td></td></tr>
<tr class="frame"><td>269</td><td>6</td><td>local 3</td><td></td></tr>
<tr class="frame"><td>270</td><td>0</td><td>local 4</td><td></td></tr>
<tr class="bframet"><td>271</td><td>123</td><td>argument 0</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>272</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="bframe"><td>273</td><td>266</td><td>Saved LCL</td><td class="fid">Sys.add12</td></tr>
<tr class="bframe"><td>274</td><td>261</td><td>Saved ARG</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframe"><td>275</td><td>4001</td><td>Saved THIS</td><td></td></tr>
<tr class="bframe"><td>276</td><td>5001</td><td>Saved THAT</td><td></td></tr>
<tr class="bframeb"><td>277</td><td>135</td><td>Return value</td><td>&larr;LCL</td></tr>
<tr class="tos"><td>278</td><td>???</td><td></td><td>&larr;SP</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">After Sys.add12() return</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>272</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>266</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>261</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4001</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5001</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="framet"><td>256</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="frame"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="bframet"><td>261</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>262</td><td>261</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>263</td><td>256</td><td>Saved ARG</td><td class="fid">Sys.main</td></tr>
<tr class="bframe"><td>264</td><td>4000</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframe"><td>265</td><td>5000</td><td>Saved THAT</td><td></td></tr>
<tr class="bframe"><td>266</td><td>0</td><td>local 0</td><td>&larr;LCL</td></tr>
<tr class="bframe"><td>267</td><td>200</td><td>local 1</td><td></td></tr>
<tr class="bframe"><td>268</td><td>40</td><td>local 2</td><td></td></tr>
<tr class="bframe"><td>269</td><td>6</td><td>local 3</td><td></td></tr>
<tr class="bframe"><td>270</td><td>0</td><td>local 4</td><td></td></tr>
<tr class="bframeb"><td>271</td><td>135</td><td>Return value</td><td></td></tr>
<tr class="tos"><td>272</td><td>???</td><td></td><td>&larr;SP</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">Before Sys.main() return</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>272</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>266</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>261</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4001</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5001</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="framet"><td>256</td><td>*</td><td>Return IP</td><td></td></tr>
<tr class="frame"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="frame"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="frame"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="frame"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="bframet"><td>261</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>262</td><td>261</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>263</td><td>256</td><td>Saved ARG</td><td class="fid">Sys.main</td></tr>
<tr class="bframe"><td>264</td><td>4000</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframe"><td>265</td><td>5000</td><td>Saved THAT</td><td></td></tr>
<tr class="bframe"><td>266</td><td>0</td><td>local 0</td><td>&larr;LCL</td></tr>
<tr class="bframe"><td>267</td><td>200</td><td>local 1</td><td></td></tr>
<tr class="bframe"><td>268</td><td>40</td><td>local 2</td><td></td></tr>
<tr class="bframe"><td>269</td><td>6</td><td>local 3</td><td></td></tr>
<tr class="bframe"><td>270</td><td>0</td><td>local 4</td><td></td></tr>
<tr class="bframeb"><td>271</td><td>246</td><td>Return value</td><td></td></tr>
<tr class="tos"><td>272</td><td>???</td><td></td><td>&larr;SP</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">After Sys.main() return</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>262</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>261</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>256</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4000</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5000</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="bframet"><td>256</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="bframe"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframe"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="bframeb"><td>261</td><td>246</td><td>Return value</td><td>&larr;LCL</td></tr>
<tr class="tos"><td>262</td><td>???</td><td></td><td>&larr;SP</td></tr>
</table>
</td><td>
<table class="stack">
<tr><th colspan="4">In Sys.init() halt loop</th></tr>
<tr class="reg"><th colspan="4">Pointers</th></tr>
<tr class="reg"><td>0</td><td>261</td><td>SP</td><td></td></tr>
<tr class="reg"><td>1</td><td>261</td><td>LCL</td><td></td></tr>
<tr class="reg"><td>2</td><td>256</td><td>ARG</td><td></td></tr>
<tr class="reg"><td>3</td><td>4000</td><td>THIS</td><td></td></tr>
<tr class="reg"><td>4</td><td>5000</td><td>THAT</td><td></td></tr>
<tr class="stack"><th colspan="4">Stack</th></tr>
<tr class="bframet"><td>256</td><td>*</td><td>Return IP</td><td>&larr;ARG</td></tr>
<tr class="bframe"><td>257</td><td>-1</td><td>Saved LCL</td><td></td></tr>
<tr class="bframe"><td>258</td><td>-2</td><td>Saved ARG</td><td class="fid">Sys.init</td></tr>
<tr class="bframe"><td>259</td><td>-3</td><td>Saved THIS</td><td class="fid">&ensp;frame</td></tr>
<tr class="bframeb"><td>260</td><td>-4</td><td>Saved THAT</td><td></td></tr>
<tr class="tos"><td>261</td><td>???</td><td></td><td>&larr;LCL, SP</td></tr>
</table>
</td>
</tr></table>
</body>
</html>