;*******************************************************************************
; memcpy函数
;实现C语言中的memcpy函数,将p2中的内容赋值到p1指向的地址中,复制个数有len决定
;void memcpy(char *p1,char *p2,int len)
;无返回值
;参数说明:char *p1: 目的地址 R60-R61
; char *p2:源地址 R62-R63
; int len:复制长度单位是字节 R64-R67
;*******************************************************************************
ORG 0664H
_memcpy:
;将函数中使用到的寄存器进行入栈
PUSH R68,4;
PUSH R0,4;
PUSH R9,1;
MOV R60,R68,2;
OR R68,R62,2;
LDBR R69,0XF0,1;
AND R68,R69,1; //20181008
IJNE R68,0,_memcpy_01;
;说明两个地址都是寄存器
_memcpy_02:
MOV R62,R0,2;
MOV R60,R2,2;
LDWR R68,0X0100;
JS R68,R66,3;
MOV R67,R9,1;
MOVA 0X01;
GOTO _memcpy_stop;
LDBR R9,0,1;
MOVA 0X01;
DEC R66,0,1;
INC R60,0,1;
INC R60,0,1;
GOTO _memcpy_02;
_memcpy_01:
MOV R60,R68,2;
AND R68,R62,2;
IJNE R68,0,_memcpy_VP;
_memcpy_04:
;说明一个VP地址一个寄存器地址
LDWR R68,0;
JS R68,R66,1;
GOTO _memcpy_stop;
LDWR R68,0XF000;
AND R68,R62,2;
IJNE R68,0,6;
;寄存器空间
MOV R62,R0,2;
LDWR R2,70;
LDBR R9,2,1;
MOVA 0X01;
INC R62,1,2;
GOTO _memcpy_03;
;VP空间
MOV R62,R0,2;
MOVXR R70,1,1;
INC R62,1,1;
_memcpy_03:
LDWR R68,0XF000;
AND R68,R60,2;
IJNE R68,0,_memcpy_05;
;寄存器空间
LDWR R68,1;
TESTS R68,R66,2;
IJNE R0,0,5;
LDWR R0,70;
MOV R60,R2,2;
LDBR R9,1,1;
MOVA 0X01;
GOTO _memcpy_stop;
LDWR R0,70;
MOV R60,R2,2;
LDBR R9,2,1;
MOVA 0X01;
INC R60,1,2;
DEC R66,1,2;
GOTO _memcpy_04;
;VP空间
_memcpy_05:
LDWR R68,1;
TESTS R68,R66,2;
IJNE R0,0,5;
MOV R60,R0,2;
MOVXR R64,1,1;
MOV R65,R71,1;
MOVXR R70,0,1;
GOTO _memcpy_stop;
MOV R60,R0,2;
MOVXR R70,0,1;
INC R60,1,1;
DEC R66,1,2;
GOTO _memcpy_04;
_memcpy_VP:
MOV R62,R0,2;
MOV R60,R2,2;
INC R66,1,1;
SHR R64,4,1;
MOV R66,R8,2;
MOVXX 0; //进行VP地址之间的交换
_memcpy_stop:
;将入栈寄存器进行出栈
POP R9,1;
POP R0,4;
POP R68,4;
RET
|