Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593970
  • 博文数量: 99
  • 博客积分: 5128
  • 博客等级: 大校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-27 19:40
文章分类

全部博文(99)

文章存档

2012年(3)

2011年(5)

2010年(4)

2009年(31)

2008年(56)

分类:

2008-08-06 10:12:41

双字节乘法子程序,原来的程序有点问题,已经修改过来了。这个我测试过多个数据,都是正确的。应该没有什么问题的了。
在这里非常感谢热心的网友:Rick () 感谢指出我的错误,谢了。
 
 

/*------------------------------------------------
                   双字节乘法子程序
        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
       

阅读(2504) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-15 15:41:51

对不起,说错了。是 inc 没有改变 c 。原来的程序 里是这个错误吧。 谢谢。。。我正在用emc,学习了。

chinaunix网友2008-11-15 14:46:45

为什么我的468的资料里看到 inc 和 add 指令都只改变 z 呀。。。资料上没有写会改变 c 呀。。