想使用STC8的增强型双数据指针加快复制速度但失败了
想优化以下复制功能,芯片为STC8A8K64S4void CopyXdata(uchar xdata *psource, uchar xdata *pdest, uchar len) small
{
do
{
*pdest = *psource;
psource ++;
pdest ++;
len --;
}while(len);
}
想利用STC8的增强型双数据指针,所以改写为以下嵌入ASM
void CopyXdata(uchar xdata *psource, uchar xdata *pdest, uchar len) small
{
//psource -> R6/R7
//pdest -> R4/R5
//len -> R3
#pragma ASM
MOV DPS,#00000000B ;选择DPTR0
MOV DPL,R7
MOV DPH,R6
MOV DPS,#00000001B ;选择DPTR1
MOV DPL,R5
MOV DPH,R4
MOV DPS,#00111000B ;设置DPTR1为递加模式,DPTR0为递加模式,使能TSL以及
;AU0和AU1,并选择DPTR0为当前的DPTR
COPY_NEXT:
MOVX A,@DPTR ;从DPTR0所指的程序空间读取数据,
MOVX @DPTR,A ;将ACC的数据写入到DPTR1所指的XDATA中,
;完成后DPTR1自动减1并将DPTR0设置为下一个目标DPTR
DJNZ R3,COPY_NEXT
MOV DPS,#00000000B ;选择DPTR0
RET
#pragma ENDASM
}
调用后异常,我对汇编不熟悉,所以请坛友帮助看看那个地方错了 COPY_NEXT下面那两行,你确认是认真的? 双指针会自动递增和切换,难道我理解错了?我参考例程写的,请坛主科普一下 楼上说的那个来回倒腾是要干嘛?增加GDP么:) 本帖最后由 Himem 于 2019-12-8 13:36 编辑
没用过这款,不过对着手册看不出什么问题,仿真器单步看看吧
前面我倒是会改成这样
MOV DPS,#00000000B
MOV DPL,R7
MOV DPH,R6
MOV DPL1,R5
MOV DPH1,R4 正是楼上提到的原因。
DPH,DPL,DPH1,DPL1有各自独立的地址,MOV DPL,R7这样的指令操作的是普通的寄存器地址,和DPTR没有关系。
只有几个特定的操作DPTR的指令才会根据情况选择用DPTR还是DPTR1,并且执行完后,自动修改DPRT。
另外,你这个注释也不对吧。
MOVX A,@DPTR ;从DPTR0所指的程序空间读取数据, health 发表于 2019-12-8 15:20
正是楼上提到的原因。
DPH,DPL,DPH1,DPL1有各自独立的地址,MOV DPL,R7这样的指令操作的是普通的寄存器地 ...
你说的对,确实是这个问题,已修改好了,我以为可以通过DSP的SEL位选择DPTR,STC的这个功能确实不错,现在对拷速度确实快多 health 发表于 2019-12-8 15:23
另外,你这个注释也不对吧。
MOVX A,@DPTR ;从DPTR0所指的程序空间 ...
注释拿了例程的,忘记改了,例程是取程序空间的数据复制 双数据指针,使用汇编才用到,C语言就不要玩了。 厉害
页:
[1]