我试图将两个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
答案 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)
这段代码有几件奇怪的事情:
你从不使用multiplicand
,那你怎么可能乘以呢?您撰写addwf multiplier, resultLow
时是否出现了复制粘贴错误?除非你想计算一个数字的平方而不是两个数的乘积,否则multiplicand
应该是所有逻辑。
你测试multiplier
的最低有效位,这是有意义的,因为你需要检查它的位,但是你向左移multiplier
,永远将该位转为0。似乎不对。要么你应该做右移,要么检查最重要的位。
在添加之后发生结果的移位。假设您将1位数而不是8位数相乘,例如1乘1,并且期望产品中的1。因此,您将1添加到结果中,然后将结果向左移动。仅此一项就可以为您提供2个产品。这怎么可能?如何扭转班次的顺序和添加?
当counter
达到0时,我无法看到循环是如何完成的。虽然我不熟悉你的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