我正在尝试为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
,最便宜的可能是将数据交换。