スタックから値をポップして D に入れる方法を知っている
@SP
M=M-1
A=M
D=M
そして、メモリの場所「this 2」を選択する方法を知っています
@2
D=A
THIS
A=A+D
問題は、両方のステップで D を使用しているため、明らかに使用していることです
M=D
望む結果にはなりません。後で何か値を保持するために2番目のレジスタが必要になると思いますか、それともここに何かが欠けていますか?
スタックから値をポップして D に入れる方法を知っている
@SP
M=M-1
A=M
D=M
そして、メモリの場所「this 2」を選択する方法を知っています
@2
D=A
THIS
A=A+D
問題は、両方のステップで D を使用しているため、明らかに使用していることです
M=D
望む結果にはなりません。後で何か値を保持するために2番目のレジスタが必要になると思いますか、それともここに何かが欠けていますか?
このような状況では、メモリ ロケーションを一時レジスタとして使用する必要があります。@SP があらかじめ定義されているように、R0、THIS、THAT などの他の一時メモリ ロケーションも定義済みであることに注意してください。
したがって、通常は、「これにポップする」、「これに追加する」、「それを R15 に移動する」などのことを行う一連の分離されたコード ナゲットとしてプログラムを作成するのが最善です。します。これにより、デバッグがはるかに簡単になります。
これを考える 1 つの方法は、実際の HACK 命令は実際にはマイクロコードであり、より大きなナゲットは実際のマシン命令であるということです。
後で、必要に応じて、これらの命令のペアをマージできるかどうかを確認できます (たとえば、最初の命令が場所 X に値を格納することで終了し、次の命令がすぐにそれを再度ロードする場合、通常は省略できます)。読み込み、場合によってはストアも)。ただし、そのような巧妙さは注意しないと噛み付いてしまう可能性があるため、より理解しやすいものを動作させてから、最適化を試みるのが最善です。
楽しむ!