ACALL的解决方案

时间:2013-02-26 17:12:15

标签: assembly 8051

为什么用于计算ACALL(来自intel 8051控制器的指令集)调用的子程序的地址的机制非常复杂。为什么他们不直接放置指令的地址并像在LCALL指令中那样跳转到该地址。

此致

1 个答案:

答案 0 :(得分:3)

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]

长话短说:如果你的函数在ACALL的范围内,你可以节省一个字节。您的汇编程序可以自动在ACALLLCALL之间进行选择。