这就是一个双字节的乘法,答案很简单就是求 (r27:r26)*(r31:r30)的值,答案应该是32位的,但只求低16位的(高16位可能在其他地方没有写出来)。。。
单片机指令只有8位运算,超过8位的就要令想办法,16位运算需要运用一个乘法分配律,类似
(a+b)*(c+d)=a*c+b*c+a*d+b*d 的方式其中a,c位高字节数, 用分配率律算4次乘法运算,但这里没有计算高字节,假设a,c位高字节,他就没有算a*c,而只是进行其他3次(不打算求高位字节),读答案是只用了r31和r30,他分别代表16位乘法的第3和第4字节,第1和第二两个高字节并没有计算。。。
mul指令时乘法指令,后面得两个寄存器中存的是8位乘数,最终的答案回存在 r1:r0中 r1为高八位
,r0为第八位。。。。。
mov是寻址指令 ,第二个寄存器的值会赋给第一个寄存器。。。
add无进位加法指令,第一个寄存器+第二个,答案存在第一个寄存器内。。。
你肯定学过10进制乘法的演草算法,也就是列竖式,这个方法是一样的,只不过你把它看成
256进制的竖式算法就很容易理解,每一个字节代表一个位。。。。
比如2位10进制运算如下
12 1代表 r31 2为r30
* 98 9代表 r27 8代表r26
-------
16 r26*r30
8 r26*r31
18 r27*r30
9 r27*r31 本程序没有计算这一步
-------
1176
这里如果我只取低2位,76 这就是本程序的做法。。。