从8051中的表中加载16位数据,而无需修改DPTR



我正在尝试为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

还要注意,您可能需要交换ar2,最便宜的可能是将数据交换。

最新更新