Ⅰ 如何用单片机的汇编语言实现16位数据相乘
将(R2R3)和(R6R7)两个16位无符号数相乘,结果放在(R4R5R6R7)
MOV
A,R3
MOV
B,R7
MUL
AB
XCH
A,R7
MOV
R5,B
MOV
B,R2
MUL
AB
ADD
A,R5
MOV
R4,A
CLR
A
ADDC
A,B
MOV
R5,A
MOV
A,R6
MOV
B,R3
MUL
AB
ADD
A,R4
XCH
A,R6
XCH
A,B
ADDC
A,R5
MOV
R5,A
MOV
F0,C
MOV
A,R2
MUL
AB
ADD
A,R5
MOV
R5,A
CLR
A
MOV
ACC.0,C
MOV
C,F0
ADDC
A,B
MOV
R4,A
Ⅱ 16位单片机 两个int型变量相乘,结果存放在long型变量里,为什么会溢出。
你这个很显然,结果是溢出了,结果把4000000中高于 65536以外的部分舍弃了,只保留了低16位,所以,结果就等效于: 4000000 % 65536 = 2304
至于为什么会这样,我猜测,如果你确定你的C是long类型的,那就应该是编译器的问题,我以前在运算char类型转换到short类型的时候遇到过这种问题。
不过,你可以这么做,保证万无一失:
long c;
c = a;
c = c*b;这样就可以了。
另外,你也可以强制转换:
long c;
c = (long)a*(long)b;
Ⅲ 32位单片机计算两个int16的数相乘和两个int32的数相乘,所花的周期一样吗
一般是一样的。
这个具体可以查一下芯片内核指令代码的手册,如果有硬件乘法指令的系统,16位运算与32位运算所用时间,一般是一样的。
楼上的忽略了32位机这个前提。一般在32位机上是会有硬件乘法指令或者是乘法器部件,是可以在单周期内计算32位乘法的。而16位的乘法,一般都是扩展成32位的乘法来实现,所以说时间一般来说是一样的,都是一个周期。
特殊的情况包括,
没有硬件乘法,使用移位加程序模拟乘法功能,32位的乘法时间可能会比16位乘多一倍,当然这还取决于乘法模拟算法的具体实现。
用32位实现16位乘法,可能需要对16位数进行额外的扩展调整,这时是16位的慢一点。一般在C语言中就是根据系统字长规定int的类型,所以在C语言中如果不考虑移植,多使用int可能会提高编译的效率,在32位机上最好使用32位的数据进行计算反而更快一些。
Ⅳ 各位高手,我想求教汇编中MUL指令的用法,我的单片机寄存器是8位的,现在有两个16位的数相乘,
MUL 指令只有一种用法即:
MUL AB 即累加器A与寄存器B相乘,结果保留到A和B中
如果是两个16位相乘,那么需要编制一个小函数来实现了。
双字节无符号数乘法程序 (R3R4*R6R7)=(R5R2R3R4)
;入口: R3,R4,R6,R7
;占用资源: ACC,B
;堆栈需求: 2字节
;出口: R5,R2,R3,R4
NMUL22 : MOV A,R4
MOV B,R7
MUL AB
XCH A,R4
MOV R5,B
MOV B,R6
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R2,A
MOV A,R3
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R2
MOV R2,A
CLR A
ADDC A,#00H
XCH A,R3
MOV B,R6
MUL AB
ADD A,R2
MOV R2,A
MOV A,B
ADDC A,R3
XCH A,R5
MOV R3,A
CLR OV
RET
Ⅳ 51单片机两个数乘法结果怎么送到一个地址里
MOV A,#21H
MOV B,#10H
MUL AB 怎么把结果送到51H里面
MOV 51H,A ;这样就行了啊
MOV 52H,B
Ⅵ 单片机指令部分,两个16进制的数怎么相乘
你可以用两个寄存器放一个数字,然后AB相乘就转换为四个寄存器相乘,结果放在四个寄存器中,这样数字就可以放下了。八位的寄存器最多能达到0FFH,放不下这么大的数,所以分开存放,然后进行相乘,可以得到结果。
Ⅶ 51单片机c语言计算两个unsigned int型数据的乘积结果髙两位溢出丢失(乘积的数据类型是unsigned long)
你把其中一个变量先放进 长整形变量中(数据类型是unsigned long), 就不会出现结果是整形了
Ⅷ 单片机如何进行两个有符号数的相乘
在 keil编译器里面 使用C语言编程 将变量定义为有符号数 就可以实现你需要的功能
若是想知道原理,可以再网上搜索单片机通用子程序 里面大部分都有多字节的有符号和无符号数的四则运算
Ⅸ 单片机双字节相乘
网上有这样的程序,直接复制过来,稍微改下就能用的。
/*---------------------------------------------------
义隆单片机
双字节的乘法
功能: (R22:R23)*(R24:R25)-->(R20:R21:R22:R23)
入口:
被乘数 :R22:R23 (R22高位)
乘数 :R24:R25 (R24高位)
出口:
积 :R20:R21:R22:R23(R20为高位)
局部变量 :
count
---------------------------------------------------*/
mul_sub:
clr r20 ; 清空寄存器和进位位
clr r21
mov a,@16 ; 循环16次
mov count,a
bc psw,c
rrc r22
rrc r23
mul_r1:
jbs psw,c ; 判断移出的一位为0还是1
jmp mul_r2 ; 0的话不做运算
mov a,r25 ; 1的话做运算 R20:R21 + R24R25 --> CR:R20:R21
add r21,a ; 低位相加
jbs psw,c
jmp mul_r0
mov a,@1 ; 如果低位进位则高位加1
add r20,a
jbs psw,c ; 判断高位加1后是否已经移出
jmp mul_r0
mov a,r24 ; 做高位运算
add r20,a
bs psw,c ; 需要手工补偿进位位
jmp mul_r2
mul_r0:
mov a,r24 ; 不需要补偿直接加高位的情况
add r20,a
mul_r2:
rrc r20
rrc r21
rrc r22
rrc r23
djz count
jmp mul_r1
ret