Optimization 在不修改DPTR的情况下,从8051中的表中加载16位数据
我正在尝试为8051处理器制作一个简单的例程,它允许我从存储在代码内存中的表中加载我选择的任何16位数字,而不需要修改DPTR的任何部分,也不需要堆栈空间。因此,不能使用推送和弹出。另外,我希望使用尽可能少的处理时间 到目前为止,我提出了以下代码,允许我从4个16位值的表中加载一个值到累加器和R2,其中R2有高字节,a有低字节 这是最有效的方法吗?如果是这样,在本例中,如何计算在每个movc指令之前要向累加器添加多少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
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
,最便宜的可能是交换表中的数据