快速8x8bit乘法组件pic18

时间:2012-10-18 17:49:28

标签: performance assembly pic pic18 8-bit

我试图将两个8位数相乘并将它们存储在一个16位的位置,以获得大于255的结果。实现这一目标的最快方法是通过移位,我试图通过rrcf函数实现并使用bcf清除不必要的携带

这就是我想出的。我试图评论所有代码,以便您能够看到我的思考过程。我对PIC18和ASM编程都很新。当(希望)提供帮助时请记住这一点。我需要把它放在比我更好的位置,当我运行MPLAB SIM时,我得到的只是计数器递减......?

我认为这是由于重复测试的最后一位乘法器,它将为零,因此每次都跳过我的add指令。你能帮我创建一个循环来从0-7位逐步移动BTFSC吗?我认为这是问题,但我无法弄清楚代码。我可能会主要写8次,但我试图保存代码空间

            LIST P=18F4550
            #include <P18F4550.INC>

            ;equates
            counter equ 0x00 ;set counter
            multiplicand equ 0x01 ;set multiplicand
            multiplier equ 0x02 ;set multiplier
            resultHigh equ 0x03 ;set resultHigh
            resultLow equ 0x04 ;set resultLow

            ;test program

            movlw d'100' ;move literal d'100' to wreg
            movwf multiplicand ;set multiplicand
            movlw d'400'       ;move literal d'400'
            movlw multiplier   ;set multiplier
            movlw d'8'         ;counter
            movwf counter      ;set counter

            main:
            btfsc multiplier, 0          ;test LSB if 0,skip next if 0
            addwf multiplier, resultLow  ;add if 1 to resultLow
            bcf STATUS,C                 ;clear carry flag
            rlcf multiplier              ;rotate multiplier left
            bcf STATUS,C                 ;clear carry
            rlcf resultLow               ;rotate resultLow w/ carry
            rlcf resultHigh              ;rotate resultHigh 
                                                                  ;w/carry from resultLow

            decf counter                 ;dec counter
            goto main                    ;repeat for 8 bits
            end

2 个答案:

答案 0 :(得分:3)

实际上PIC18 asm支持单CPU周期8 * 8不对称硬件乘法。

   MOVLW 100
   MOVWF multiplicand
   MOVLW 33
;multiply multiplicand with WREG 
   MULWF multiplicand
;product is stored in registers PRODH:PRODL

答案 1 :(得分:0)

这段代码有几件奇怪的事情:

  1. 你从不使用multiplicand,那你怎么可能乘以呢?您撰写addwf multiplier, resultLow时是否出现了复制粘贴错误?除非你想计算一个数字的平方而不是两个数的乘积,否则multiplicand应该是所有逻辑。

  2. 你测试multiplier的最低有效位,这是有意义的,因为你需要检查它的位,但是你向左移multiplier,永远将该位转为0。似乎不对。要么你应该做右移,要么检查最重要的位。

  3. 在添加之后发生结果的移位。假设您将1位数而不是8位数相乘,例如1乘1,并且期望产品中的1。因此,您将1添加到结果中,然后将结果向左移动。仅此一项就可以为您提供2个产品。这怎么可能?如何扭转班次的顺序和添加?

  4. counter达到0时,我无法看到循环是如何完成的。虽然我不熟悉你的CPU,但我认为你递减counter然后无条件地跳回来到main。是什么使这成为条件跳跃?

  5. 以下伪代码显示了应如何进行乘法运算:

    multiplier = multiplier_value
    multiplicand = multiplicand_value
    
    counter = 8
    resultLow = 0
    resultHigh = 0
    
    main:
    
    carry = 0
    shift left: carry <- resultLow <- carry
    shift left: carry <- resultHigh <- carry
    
    carry = 0 ; you don't need to zero it here, actually
    shift left: carry <- multiplier <- carry
    
    if carry = 0, goto no_add
    
    carry = 0
    resultLow = resultLow + multiplicand + carry
    resultHigh = resultHigh + 0 + carry
    
    no_add:
    
    counter = counter - 1
    if counter ≠ 0, goto main