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;
}