liht1634 发表于 2010-1-10 09:25

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

本帖最后由 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
                DECFSZCNT1,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哥们:我可能用到"建表",到时候再交流。

liht1634 发表于 2010-1-13 08:58

匠人老师还给评分了,谢!

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, ACCESS271:                   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
不知道你说的是不是这样的建表。返回的数据是随意罗列的。

程序匠人 发表于 2010-1-13 09:05

匠人老师还给评分了,谢!
liht1634 发表于 2010-1-13 08:58 https://bbs.21ic.com/images/common/back.gif

通过自己分析找到问题,并且能够让帖子有始有终,这两点都应该得到鼓励。:)
页: [1]
查看完整版本: 程序匠人的移位法多字节乘法的疑问