打印
[匠人手记]

程序匠人的移位法多字节乘法的疑问

[复制链接]
3822|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 liht1634 于 2010-1-10 09:34 编辑

LIST     P=18F2321
               #include <P18F2321.INC>
;被乘数SOUH:SOUL,乘数RES3:RES0(位数32位),乘积在16H-1BH中,高位在前
MUL32_16                             ;SOUH:SOUL*RES3:RES0
                CLRF    16H          ;乘积清零
                CLRF    17H
                CLRF    18H
                CLRF    19H
                CLRF    1AH
                CLRF    1BH

                MOVLW   0E1H         ;验证数据
                MOVWF   SOUH
                MOVWF   SOUL
                MOVLW   00H
                MOVWF   RES3
                MOVLW   03H
                MOVWF   RES2
                MOVLW   87H
                MOVWF   RES1
                MOVLW   0C1H
                MOVWF   RES0

                MOVLW   20H          ;20H=32乘数位数
                MOVWF   CNT1
LOOP1
                BCF     STATUS,C
                RRCF    RES3          ;连C右移一次
                RRCF    RES2
                RRCF    RES1
                RRCF    RES0
                BTFSS   STATUS,C
                GOTO    LOOP2
                MOVF    SOUL,W       ;双字节加法
                ADDWF   17H,F        ;被加数16H:17H,加数SOUH:SOUL
                BTFSC   STATUS,C
                INCF    SOUH,F
                MOVF    SOUH,W
                ADDWF   16H,F
LOOP2
                RRCF    16H          ;连C右移一次
                RRCF    17H
                RRCF    18H
                RRCF    19H
                RRCF    1AH
                RRCF    1BH
                DECFSZ  CNT1,F
                GOTO    LOOP1
                RETURN
我是根据程序匠人的移位法多字节乘法,出的结果不对,请对上面的程序给予指正为谢。算法如下:

相关帖子

沙发
szshawn2010| | 2010-1-10 12:59 | 只看该作者
哥们问一下.
你是不是应用到了"建表"

如果你应用过建表,请教下,如何建立表格在MCU中

使用特权

评论回复
板凳
liht1634|  楼主 | 2010-1-10 13:37 | 只看该作者
本帖最后由 liht1634 于 2010-1-10 13:44 编辑

单步调试过程中找到原因了,INCF    SOUH,F这一条指令破坏了加数,只要存储SOUH到TEMP中,在ADDWF   16H,F后再还原SOUH即可。《PIC单片机子程序库及运算平台》这本书中多字节乘法也是用这种算法的,是一种不错的算法。
另外双字节加法如果是多字节加法就要用到间接寻址,右移一次也可以用间接寻址,我这里用多个右移指令更容易看明白。
szshawn2010哥们:我可能用到"建表",到时候再交流。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
程序匠人 + 6
地板
liht1634|  楼主 | 2010-1-13 08:58 | 只看该作者
匠人老师还给评分了,谢!

使用特权

评论回复
5
liht1634|  楼主 | 2010-1-13 09:00 | 只看该作者
本帖最后由 liht1634 于 2010-1-13 09:14 编辑

回szshawn2010:
CONVERT
  019E    0E01     MOVLW 0x1                      266:                   MOVLW   01H
  01A0    6EFA     MOVWF 0xffa, ACCESS            267:                   MOVWF   PCLATH
  01A2    0E02     MOVLW 0x2                      268:                   MOVLW   02H
  01A4    6E21     MOVWF 0x21, ACCESS             269:                   MOVWF   MUL_BUF
  01A6    0EAA     MOVLW 0xaa                     270:                   MOVLW   TABLE
  01A8    2421     ADDWF 0x21, W, ACCESS  271:                   ADDWF   MUL_BUF,W
                                                                  272:   TABLE
  01AA    6EF9     MOVWF 0xff9, ACCESS      273:                   MOVWF   PCL
  01AC    0C55     RETLW 0x55                    274:                   RETLW   55H
  01AE    0C02     RETLW 0x2                      275:                   RETLW   02H
  01B0    0C1F     RETLW 0x1f                     276:                   RETLW   1FH
  01B2    0C03     RETLW 0x3                      277:                   RETLW   03H
  01B4    0C10     RETLW 0x10                     278:                   RETLW   10H
  01B6    0C04     RETLW 0x4                      279:                   RETLW   04H
  01B8    0C55     RETLW 0x55                     280:                   RETLW   55H
  01BA    0C02     RETLW 0x2                      281:                   RETLW   02H
  01BC    0C1F     RETLW 0x1f                     282:                   RETLW   1FH
  01BE    0C03     RETLW 0x3                      283:                   RETLW   03H
  01C0    0C10     RETLW 0x10                     284:                   RETLW   10H
  01C2    0C04     RETLW 0x4                      285:                   RETLW   04H
  01C4    0C55     RETLW 0x55                     286:                   RETLW   55H
  01C6    0C02     RETLW 0x2                      287:                   RETLW   02H
  01C8    0C1F     RETLW 0x1f                     288:                   RETLW   1FH
  01CA    0C03     RETLW 0x3                      289:                   RETLW   03H
  01CC    0C10     RETLW 0x10                     290:                   RETLW   10H
  01CE    0C04     RETLW 0x4                      291:                   RETLW   04H

当前的程序计数器开始于019E,所以有下面两条指令,如果没有这两条则程序只能在前256个字节(PCL最大0FFH)范围运行,即PIC18系列的128个单字节指令。和PIC16系列编程不一样。
MOVLW   01H
MOVWF   PCLATH
不知道你说的是不是这样的建表。返回的数据是随意罗列的。

使用特权

评论回复
6
程序匠人| | 2010-1-13 09:05 | 只看该作者
匠人老师还给评分了,谢!
liht1634 发表于 2010-1-13 08:58


通过自己分析找到问题,并且能够让帖子有始有终,这两点都应该得到鼓励。:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

178

主题

365

帖子

1

粉丝