ACALL
(インテル 8051 コントローラーの命令セットから)によって呼び出されるサブルーチンのアドレスを計算するために使用されるメカニズムが非常に複雑な理由。命令のアドレスを直接入力して、LCALL 命令のようにそのアドレスにジャンプしないのはなぜですか。
よろしく
LCALL
3 バイトの命令であるため、オペコードと 16 ビットの絶対アドレスを取得します。ACALL
2 バイトに収まる短いバージョンとして存在します。単純なアプローチは、アドレスに 8 ビットを使用することでしたが、エンジニアは、オペコード自体にエンコードされた上位 3 ビットを使用して、範囲を広げるために 11 ビットを許可することにしました。8051 プログラムの一般的なサイズが小さいことを考慮しても、8 ビットはおそらく制約が多すぎるでしょう。
間違いなく、エンコード方式はそれほど複雑ではありません (マイクロコントローラーではほとんど複雑ではありません)。アドレスを 3 つの部分からまとめる必要があります。
pc
=[top 5 bits of current program counter] [3 bits from the opcode] [8 bits from the operand]
簡単に言うと、関数が の範囲内にあるACALL
場合は、1 バイトを節約できます。アセンブラーは、ACALL
とLCALL
自動的に選択できる場合があります。