程序匠人的移位法多字节乘法的疑问
本帖最后由 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
我是根据程序匠人的移位法多字节乘法,出的结果不对,请对上面的程序给予指正为谢。算法如下:
哥们问一下.
你是不是应用到了"建表"
如果你应用过建表,请教下,如何建立表格在MCU中 本帖最后由 liht1634 于 2010-1-10 13:44 编辑
单步调试过程中找到原因了,INCF SOUH,F这一条指令破坏了加数,只要存储SOUH到TEMP中,在ADDWF 16H,F后再还原SOUH即可。《PIC单片机子程序库及运算平台》这本书中多字节乘法也是用这种算法的,是一种不错的算法。
另外双字节加法如果是多字节加法就要用到间接寻址,右移一次也可以用间接寻址,我这里用多个右移指令更容易看明白。
szshawn2010哥们:我可能用到"建表",到时候再交流。 匠人老师还给评分了,谢! 本帖最后由 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
不知道你说的是不是这样的建表。返回的数据是随意罗列的。 匠人老师还给评分了,谢!
liht1634 发表于 2010-1-13 08:58 https://bbs.21ic.com/images/common/back.gif
通过自己分析找到问题,并且能够让帖子有始有终,这两点都应该得到鼓励。:)
页:
[1]