; .BCD_ASM.A51 generated from: BCD_ASM.c ;Edit By xwj ;Program Size: DATA=8.0 XDATA=0 CODE=14 ;Program Size: DATA=8.0 XDATA=0 CODE=18
$NOMOD51 NAME BCD_ASM
Big_ENDian EQU 1 ;1为大端模式
?PR?_DATAAdd?BCD_ASM SEGMENT CODE PUBLIC _DATAAdd
;//xwj修改的程序: ;//入口: ;//*DATAOneDptr==>被加数数组的指针 ;//*DATATwoDptr==>加数的数组指针 ;// DATALEND ==>数据字节数 ;//出口: ;//*DATAOneDptr==>结果保存在*DATAOneDptr地址,会覆盖原*DATAOneDptr处数据 ;void DATAAdd(unsigned char IDATA *DATAOneDptr,unsigned char IDATA *DATATwoDptr,unsigned char DATALEND) RSEG ?PR?_DATAAdd?BCD_ASM _DATAAdd: USING 0 IF Big_ENDian <> 1 ;非1为小端模式
MOV A,R7 MOV R0,A MOV A,R5 MOV R1,A CLR C ;//清除低位向高位的进位 BCD_loop: MOV A,@R0 ;//ACC=*DATAOneDptr+*DATATwoDptr+CY; ADDC A,@R1 ;//二进制求和(没有上次低位向高位的进位) DA A ;//BCD码MCS51硬件调整;//C暂存低位向高位的进位 MOV @R0,A ;//回写结果到*DATAOneDptr INC R0 ;//DATAOneDptr++; INC R1 ;//DATATowDptr++; DJNZ R3,BCD_loop ;//{...}while(--DATALEND) RET
ELSE ;1为大端模式,有地址调整
MOV A,R7 ADD A,R3 DEC A MOV R0,A MOV A,R5 ADD A,R3 DEC A MOV R1,A CLR C ;//清除低位向高位的进位 BCD_loop: MOV A,@R0 ;//ACC=*DATAOneDptr+*DATATwoDptr+CY; ADDC A,@R1 ;//二进制求和(没有上次低位向高位的进位) DA A ;//BCD码MCS51硬件调整;//C暂存低位向高位的进位 MOV @R0,A ;//回写结果到*DATAOneDptr DEC R0 ;//DATAOneDptr++; DEC R1 ;//DATATowDptr++; DJNZ R3,BCD_loop ;//{...}while(--DATALEND) RET
ENDIF END
;本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本请联系xuwenjun@21cn.com |