1

我试图将两个 8 位数字相乘并将它们存储在 16 位位置以获得大于 255 的结果。完成此操作的最快方法是通过移位,我试图通过 rrcf 函数实现它并使用 bcf 清除不需要的进位。

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

我认为这是由于乘法器的最后一位被反复测试,这将是零,因此每次都跳过我的加法指令。你能帮我创建一个循环以从 0-7 位逐步移动 BTFSC 吗?我认为这是问题所在,但我无法弄清楚代码。我基本上可以写 main 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
4

2 回答 2

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
于 2012-10-19T07:38:27.810 回答
0

这段代码有几个奇怪的地方:

  1. 你从不使用multiplicand,那么你怎么可能乘以它呢?你写的时候是复制粘贴错误addwf multiplier, resultLow吗?按照所有逻辑multiplicand应该在哪里,除非你想计算一个数字的平方而不是两个数字的乘积。

  2. 您测试 的最低有效位multiplier,这是有道理的,因为您需要检查它的位,但随后您multiplier向左移动,将该位永远变为 0。似乎不对。您应该进行右移或检查最高有效位。

  3. 结果的移位发生在添加到它之后。假设您将 1 位数字而不是 8 位数字相乘,例如 1 乘 1,并且在乘积中期望 1。因此,您将结果加 1,然后将结果左移。仅此一项就为您提供了产品中的 2。这怎么可能是对的?颠倒 shift 和 add 的顺序怎么样?

  4. 当达到 0 时,我看不到循环是如何结束的。counter虽然我不熟悉你的 CPU,但在我看来,你递减counter然后无条件跳回main. 是什么使它成为条件跳转?

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

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
于 2012-10-19T01:29:38.410 回答