Tlsr8258 32位乘32位值大于32位的问题

1. 在调试RSA算法的 时候,有一个运算需要用到两个32位的数相乘,而这两个数的积会大于32位。通过实验验证发现如果两个数据的积大于32位,即使用一个64位的数去接,他会自动被截取掉(在蓝牙单连接的SDK中会出现)。并且我还验证了tlsr8258外设SDK却不存在这个问题。

2. 通过对比发现两个SDK在div_mod.S这个汇编文件中,蓝牙单连接的SDK以下的函数注释调了

//removed
#if 1 // 0
	//.section	.ram_code,"ax" //in ram code
	.align	4
	.global	mul32x32_64
	.thumb_func
	.type	mul32x32_64, %function
mul32x32_64:
    tmul	r0, r1
    tloadr	r1, [pc, #4]
    tloadr	r1, [r1, #0]
    tjex	lr
    .word(0x008006fc)
#endif

#if 1 //0
	//.section	.ram_code,"ax" //in ram code
	.align	4
	.global	mz_mul1
	.thumb_func
	.type	mz_mul1, %function

3. 本以为打开就可以,然而还是不行,还需要声明一下这个汇编函数到c文件中

//方法1: 在调用的头文件中声明
u64 mul32x32_64(u32 a,u32 b);

//方法2: 在调用的.c文件中声明
extern u64 mul32x32_64(u32 a,u32 b);

4. 然后在用这个函数来计算两个32位数相乘的积,不能简单的使用两个数相乘(是不是很奇葩,听大佬的解释是因为这家的MCU的乘法是软件计算,并不是硬件计算,这款IC用的是精简指令,也许其他使用精简指令的IC也会有同样的问题)

void dmult(uint32_t a, uint32_t b, uint32_t *cHigh, uint32_t *cLow)
{
	uint64_t temp3;

	uint32_t temp1 = a;
	uint32_t temp2 = b;

	temp3 = mul32x32_64(temp1,temp2);

	*cHigh = temp3>>32;
	*cLow = temp3;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入门->放弃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值