我正在尝试找出是否有一种方法可以扩展我的缓冲区,而无需使用比较语句。
到目前为止,这是我的代码,其中一个函数将数据从累加器存储到缓冲区的开头,另一个函数从累加器的末尾返回数据。
我了解我没有缓冲区溢出检查机制,但这不是我关心的问题。
我只是想知道是否有办法增加缓冲区的大小,同时仍然使用与逻辑(如果超出了结束则返回到缓冲区的开头)。
BUF equ 40h ;Start of buffer at address 40
BUFMASK equ 5Fh ;Buffer ends at address 5F
IR0 equ 0h ;R0 is address 0
IR1 equ 1h ;R1 is address 0
initialize:
mov R0,#BUF
mov R1,#BUF
;normal code here
sjmp $
storebyte:
mov @R0,A
inc R0
anl IR0,#BUFMASK ;Same as going to 40h if 60h is reached
ret
getbyte:
mov A,@R1
inc R1
anl IR1,#BUFMASK ;Same as going to 40h if 60h is reached
ret
到目前为止,我能看到的唯一方法是将所有与anl相关的语句替换为以下内容:
cjne IRx,#BUFMASK+1,notend
mov Rx,#BUF
notend:
但是如果可能的话,我想避免这种情况,因为它至少需要6个额外的ROM空间用于cjne字节,并且每次到达缓冲区末端时都需要2个时钟周期。
对我来说,我认为选择不同口罩的问题。
对于当前的RAM使用情况,我仅使用地址20h-23h和0h-7h,堆栈位于8h,并且不使用任何调用,因此我认为必须有一种简单的方法来使用30h-7Fh对于没有上述比较语句的缓冲区,我认为也许具有正确逻辑运算的正确位掩码可以解决问题,但是我还没有弄清楚。
硬件为AT89C2051,因此无法将超过7Fh的地址用于常规RAM。
那么我最终还是会坚持使用cjne还是可以使用更好的位掩码和逻辑运算来节省时钟周期?