外部 RAM のない 8051 マイクロコントローラーがあるとします。内部 RAM は 128 バイトで、約 80 バイトが使用可能です。そして、スタック言語用のコンパイラを書きたいとします。
RPN 式をコンパイルするとします2 3 +
。8051にはネイティブpush
とpop
命令があるので、あなたは書くことができます
push #2
push #3
次に、次のように実装できます+
。
pop A ; pop 2 into register A
pop B ; pop 3 into register B
add A, B ; A = A + B
push A ; push the result on the stack
シンプルですね。ただし、この場合+
はインライン アセンブリとして実装されます。このコードを再利用してサブルーチンに入れたい場合はどうすればよいでしょうか? 幸いなことに、8051 には指示がlcall
ありret
ます。lcall LABEL
戻りアドレスをスタックにプッシュして LABEL にジャンプし、ret
スタックの一番上に指定されたアドレスに戻ります。ただし、これらの操作はスタックに干渉するため、最初の命令lcall
の実装にジャンプすると、操作したい値ではなく戻りアドレスがポップされます。+
pop A
各関数の引数の数が事前にわかっている言語では、いくつかの値をスタックの一番上に並べ替えて、引数をスタックの一番上に置き、戻りアドレスをさらに下にプッシュすることができました。しかし、スタックベースの言語の場合、各関数が受け取る引数の数はわかりません。
では、これらの状況で関数呼び出しを実装するには、どのようなアプローチができるのでしょうか?
8051 命令セットの説明は次のとおりです。http://sites.fas.harvard.edu/~phys123/8051_refs/8051_instruc_set_ref.pdf