peterlzj 发表于 2019-12-8 11:49:20

想使用STC8的增强型双数据指针加快复制速度但失败了

想优化以下复制功能,芯片为STC8A8K64S4
void 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       
}          
调用后异常,我对汇编不熟悉,所以请坛友帮助看看那个地方错了

takashiki 发表于 2019-12-8 12:16:56

COPY_NEXT下面那两行,你确认是认真的?

peterlzj 发表于 2019-12-8 13:02:13

双指针会自动递增和切换,难道我理解错了?我参考例程写的,请坛主科普一下

1a2b3c 发表于 2019-12-8 13:03:19

楼上说的那个来回倒腾是要干嘛?增加GDP么:)

Himem 发表于 2019-12-8 13:35:07

本帖最后由 Himem 于 2019-12-8 13:36 编辑

没用过这款,不过对着手册看不出什么问题,仿真器单步看看吧

前面我倒是会改成这样
MOV   DPS,#00000000B
MOV   DPL,R7                                       
MOV   DPH,R6                                       
MOV   DPL1,R5                                       
MOV   DPH1,R4   

health 发表于 2019-12-8 15:20:44

正是楼上提到的原因。
DPH,DPL,DPH1,DPL1有各自独立的地址,MOV DPL,R7这样的指令操作的是普通的寄存器地址,和DPTR没有关系。
只有几个特定的操作DPTR的指令才会根据情况选择用DPTR还是DPTR1,并且执行完后,自动修改DPRT。

health 发表于 2019-12-8 15:23:09

另外,你这个注释也不对吧。
MOVX    A,@DPTR                                 ;从DPTR0所指的程序空间读取数据,

peterlzj 发表于 2019-12-8 17:01:08

health 发表于 2019-12-8 15:20
正是楼上提到的原因。
DPH,DPL,DPH1,DPL1有各自独立的地址,MOV DPL,R7这样的指令操作的是普通的寄存器地 ...

你说的对,确实是这个问题,已修改好了,我以为可以通过DSP的SEL位选择DPTR,STC的这个功能确实不错,现在对拷速度确实快多

peterlzj 发表于 2019-12-8 17:02:29

health 发表于 2019-12-8 15:23
另外,你这个注释也不对吧。
MOVX    A,@DPTR                                 ;从DPTR0所指的程序空间 ...

注释拿了例程的,忘记改了,例程是取程序空间的数据复制

小李非刀 发表于 2019-12-20 17:18:17

双数据指针,使用汇编才用到,C语言就不要玩了。

dgtg 发表于 2019-12-20 20:48:30

厉害
页: [1]
查看完整版本: 想使用STC8的增强型双数据指针加快复制速度但失败了