/*------------------------------------------------ 双字节乘法子程序 1. 芯片 :EM78P156N 2. 作者 :Etual 3. 联系 :Etual@163.com 4. 日期 :2007-4-27 2008-8-6(修改)
测试条件:0*0 = 0 0*1 = 0 0xFFFF * 0xFFFF = 0xFFFE0001 0xAAAA * 0xAAAA = 0x71C638E4 0x5555 * 0x5555 = 0x1C718E39 结果: 抽取了几个比较极限的参数,全零和最大值情况 另外取了一个普通数值,全部计算正确。 -------------------------------------------------*/
r20 == 0x20 r21 == 0x21 r22 == 0x22 r23 == 0x23 r24 == 0x24 r25 == 0x25 r26 == 0x26 count == 0x27 psw == 0x03 c == 0 z == 2
/*-----------------------------------------------*/ org 0x00 jmp start start: mov a,@0xaa mov r22,a mov a,@0xaa mov r23,a mov a,@0xaa mov r24,a mov a,@0xaa mov r25,a
call mul_sub loop: wdtc jmp loop
/*--------------------------------------------------- 双字节的乘法 功能: (R22:R23)*(R24:R25)-->(R20:R21:R22:R23) 入口: 被乘数 :R22:R23 (R22高位) 乘数 :R24:R25 (R24高位) 出口: 积 :R20:R21:R22:R23(R20为高位) 局部变量 : count ---------------------------------------------------*/
mul_sub: clr r20 ; 清空寄存器和进位位 clr r21 mov a,@16 ; 循环16次 mov count,a bc psw,c rrc r22 rrc r23 mul_r1: jbs psw,c ; 判断移出的一位为0还是1 jmp mul_r2 ; 0的话不做运算 mov a,r25 ; 1的话做运算 R20:R21 + R24R25 --> CR:R20:R21 add r21,a ; 低位相加 jbs psw,c jmp mul_r0 mov a,@1 ; 如果低位进位则高位加1 add r20,a jbs psw,c ; 判断高位加1后是否已经移出 jmp mul_r0 mov a,r24 ; 做高位运算 add r20,a bs psw,c ; 需要手工补偿进位位 jmp mul_r2 mul_r0: mov a,r24 ; 不需要补偿直接加高位的情况 add r20,a mul_r2: rrc r20 rrc r21 rrc r22 rrc r23 djz count jmp mul_r1 ret
|