Optimization 在不修改DPTR的情况下,从8051中的表中加载16位数据

Optimization 在不修改DPTR的情况下,从8051中的表中加载16位数据,optimization,lookup-tables,8051,16-bit,accumulator,Optimization,Lookup Tables,8051,16 Bit,Accumulator,我正在尝试为8051处理器制作一个简单的例程,它允许我从存储在代码内存中的表中加载我选择的任何16位数字,而不需要修改DPTR的任何部分,也不需要堆栈空间。因此,不能使用推送和弹出。另外,我希望使用尽可能少的处理时间 到目前为止,我提出了以下代码,允许我从4个16位值的表中加载一个值到累加器和R2,其中R2有高字节,a有低字节 这是最有效的方法吗?如果是这样,在本例中,如何计算在每个movc指令之前要向累加器添加多少 mov A,#2h ;want 2nd entry fro

我正在尝试为8051处理器制作一个简单的例程,它允许我从存储在代码内存中的表中加载我选择的任何16位数字,而不需要修改DPTR的任何部分,也不需要堆栈空间。因此,不能使用推送和弹出。另外,我希望使用尽可能少的处理时间

到目前为止,我提出了以下代码,允许我从4个16位值的表中加载一个值到累加器和R2,其中R2有高字节,a有低字节

这是最有效的方法吗?如果是这样,在本例中,如何计算在每个movc指令之前要向累加器添加多少

  mov A,#2h         ;want 2nd entry from table
  acall getpointer  ;run function below
                    ;here R2:A should form correct 16-bit pointer ( = 0456h)
  END

  getpointer:
      rl A                ;multiply A value * 2
      mov R2,A            ;copy to R2
      inc R2              ;R2=A+1
                          ;add something to A but what?
      movc A,@A+PC        ;Load first byte
      xch A,R2            ;put result in R2 and let A=original A+1
                          ;add something to A again but what?
      movc A,@A+PC        ;load second byte
  ret                   ;keep result in A and exit
  mytable: 
      dw 0123h
      dw 0456h
      dw 0789h
      dw 0000h
试试这个:

getpointer:
    rl  a
    mov r2, a
    add a, #5   ; skip all insts after 1st movc and 1 byte
    movc    a, @a+pc
    xch a, r2   ; 1-byte
    inc a   ; 1-byte ; skip all instrs after 2nd movc
    movc    a, @a+pc ; 1-byte
    ret     ; 1-byte
mytable:
    ...
我希望我做对了。请注意,
movc a、@a+pc
首先递增
pc
,然后将
a
加到该递增值上。这就是为什么我在注释中添加了指令长度,以显示有多少代码

请注意,索引2对应于
0789h
,而不是
0456h

还请注意,您可能需要交换
a
r2
,最便宜的可能是交换表中的数据