为什么用于计算由ACALL
(来自intel 8051控制器的指令集)调用的子程序地址的机制如此复杂。他们为什么不像我们在 LCALL 指令中那样直接输入指令的地址并跳转到该地址。
问候
LCALL
作为 3 字节指令,您将获得一个操作码和 16 位绝对地址。ACALL
作为适合 2 个字节的较短版本存在。简单的方法是只使用 8 位作为地址,但工程师决定允许 11 位用于更大范围,前 3 位编码在操作码本身中。即使考虑到通常很小的 8051 程序,8 位也可能过于受限。
可以说编码方案并不是非常复杂(在微控制器中很少有),您只需将地址从 3 个部分放在一起:
pc
=[top 5 bits of current program counter] [3 bits from the opcode] [8 bits from the operand]
长话短说:如果你的函数在 a 的范围内ACALL
,你可以节省一个字节。您的汇编程序可能能够在ACALL
和LCALL
自动之间进行选择。