assembly 如何用汇编器实现8位PIC的乘法运算?

tzxcd3kk  于 2023-01-05  发布在  其他
关注(0)|答案(1)|浏览(161)

我怎样才能把一个自然数乘以一个常数(也是自然数)?
我对PIC和汇编程序还是个新手,我只需要一个简单的例子来理解它是如何工作的(比如说5和6相乘或者5和3相乘)。我正在做一些功课,现在我只是在乘以一个小的数字,所以我不需要更大的数字的例子,以及如何处理溢出和类似的问题。
我在网上发现,这可以在下面的例子,但它似乎不对我,所以我想我只是不明白它。

movlw d'5'

; multiply W register by 6
addwf W, F
addwf W, F
addwf W, F

我会很感激任何帮助。

3wabscal

3wabscal1#

我不熟悉你们的汇编语言,但一般来说,如果你想乘以一个常数,最容易用2的幂次来考虑这个问题。
(原谅我,我不知道数学教科书脚本的HTML代码)
假设你想把一个数字乘以320,这是你在320像素宽屏的复古硬件上经常做的事情。
我们可以将320 * x分解为2的幂和(这里有个提示:看看你想乘的数字的二进制表示会有帮助!)
320x = 256x + 64x
虽然这看起来像是计算机要解决的一个更复杂的问题,但实际上并不是,因为大多数CPU架构都有一个“位移位”操作,这实际上是一个非常快的“乘2”。编译器会倾向于用移位和加法来写乘法运算以保存时间。尽管代码在程序中占用了更多的字节,它比实际的mul要快得多。
如果没有专用的移位指令,简单地将寄存器加到其自身上也会得到相同的结果。在上面的例子中,您需要先将起始值复制到另一个寄存器,然后分别进行乘法运算,最后将它们相加。
举个简单的例子,如果你只想乘10:

; 10x = 8x + 2x

你可以将初始值复制到另一个寄存器(如果有的话)或内存(如果没有的话)中,然后将该值自身加3次,再将之前备份的值自身加1次,最后将两者相加,得到结果。

相关问题