无符号双字节乘法c语言程序框图,单片机两个双字节无符号数相乘程序举例

《单片机两个双字节无符号数相乘程序举例》由会员分享,可在线阅读,更多相关《单片机两个双字节无符号数相乘程序举例(3页珍藏版)》请在人人文库网上搜索。

1、单片机两个双字节无符号数相乘程序举例本程序适用于Intel的51系统单片机 例将(R2R3 )和(R6R7 )两个双字节无符号数相乘,结果送R4R5R6R7。用移位和迭加的方式,步骤如下:1 )清部分积(高16位)R4R5=0。循环数16。2)把R4R5R6R7右移一位,从最低位开始检查乘数R6R7的各个位。3)如乘数位为1本程序适用于Intel的51系统单片机例将(R2R3 )和(R6R7 )两个双字节无符号数相乘,结果送 R4R5R6R7。用移位和迭加的方式,步骤如下:1 )清部分积(高16位)R4R5=0。循环数16。2 )把R4R5R6R7右移一位,从最低位开始检查乘数R6R7的各个位。

2、。3)如乘数位为1,则被乘数R2R3加到部分积R4R5中,否则不加。4)循环数减1,不到16次再返回1 )。NMUL :MOV R4,#0MOV R5,#0 ;积的高16位=0MOV R0,#16;乘数16位二进制CLR CNMLP :MOV A,R4RRC AMOV R4,AMOV A,,R5RRC AMOV R5,AMOV A,R6RRC AMOV R6 , AMOVA , R7RRC AMOV R7 , A ; (R4R5R6R7 )右移一位JNC NMLNR4R5 ) = ( R4R5 ) + ( R2R3 )MOV A , R5 ;若移出位=1,则ADD A , R3MOV R5 , AMOV A , R4ADDCA , R2MOV R4 , ANMLN : DJNZ R0 , NMLPMOV A , R4 ;最后再移位一次RRC AMOV R4 , AMOV A , R5RRC AMOV R5 , AMOV A , R6RRC AMOV R6 , AMOVA , R7RRC AMOV R7 , A ; (R4R5R6R7 )右移一位RET。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机中的字节无符号乘法可以通过分解为单字节乘法来实现。具体地,假设要计算两个字节无符号a和b的乘积,可以将a和b分别拆分为高8位和低8位: a = a_h * 256 + a_l b = b_h * 256 + b_l 则a * b可以表示为: a * b = (a_h * 256 + a_l) * (b_h * 256 + b_l) = a_h * b_h * 256 * 256 + (a_h * b_l + a_l * b_h) * 256 + a_l * b_l 其中,a_h * b_h和a_l * b_l都是单字节无符号的乘积,可以使用单片机乘法指令进行计算。而a_h * b_l和a_l * b_h则需要先将a_h和a_l分别与b_l和b_h相乘,再将结果相加,这样可以避免溢出。 具体的实现可以参考下面的代码(以AVR单片机为例): uint16_t uint16_mul(uint8_t a, uint8_t b) { uint16_t result; asm volatile( "mul %B1, %B2 \n\t" "mov %A0, r0 \n\t" "clr r1 \n\t" "mul %A1, %A2 \n\t" "add %A0, r0 \n\t" "adc %B0, r1 \n\t" "mul %B1, %A2 \n\t" "add %A0, r0 \n\t" "adc %B0, r1 \n\t" "mul %A1, %B2 \n\t" "add %A0, r0 \n\t" "adc %B0, r1 \n\t" : "=&r" (result) : "r" (a), "r" (b) : "r0", "r1" ); return result; } uint16_t uint16_mul_high8(uint8_t a, uint8_t b) { return uint16_mul(a, b) >> 8; } uint16_t uint16_mul_low8(uint8_t a, uint8_t b) { return uint16_mul(a, b) & 0xff; } uint16_t uint16_mul_uint16(uint16_t a, uint16_t b) { uint8_t a_h = a >> 8; uint8_t a_l = a & 0xff; uint8_t b_h = b >> 8; uint8_t b_l = b & 0xff; return ((uint16_t)uint16_mul_high8(a_h, b_l) << 8) + ((uint16_t)uint16_mul_high8(a_l, b_h) << 8) + uint16_mul_low8(a_l, b_l); } 其中,uint16_mul函实现了两个8位无符号乘法,返回一个16位无符号。uint16_mul_high8和uint16_mul_low8分别返回乘积的高8位和低8位。uint16_mul_uint16实现了两个16位无符号乘法。注意,在AVR单片机中,乘法指令mul可以同时计算两个8位无符号的乘积,结果存储在16位寄存器r1:r0中。因此,需要使用汇编语言来实现乘法。其他单片机的实现方法可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值