4

外部 RAM のない 8051 マイクロコントローラーがあるとします。内部 RAM は 128 バイトで、約 80 バイトが使用可能です。そして、スタック言語用のコンパイラを書きたいとします。

RPN 式をコンパイルするとします2 3 +。8051にはネイティブpushpop命令があるので、あなたは書くことができます

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

4

1 に答える 1