工具/软件:TI C/C++编译器
您好!
我想寻求帮助、将使用扩展 ASM 的内联汇编器代码转换为独立的汇编器文件、因为 ARM 编译器不支持扩展 asm (请参阅第116页的 spnu151i)。
它是大数字乘法库的一部分、该库提供了一部分代码作为 C 和扩展 ASM。 使用 C 代码时、一切运行正常、但运行速度有点慢。 因此,我想用我需要转换的汇编代码替换此 C 代码,因为不支持扩展 ASM
使用的 CPU 是 F28M35H52C
这是库中的函数:
void MPI_mul_hlp (size_t i、mbedtls_MPI_uint * s、mbedtls_MPI_uint * d、mbedtls_MPI_uint b) { mbedtls_MPI_uint c = 0、t = 0; for (; i >=16;i --16) { MULADDC_INIT MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_STOP } for (; i >=8;i -=8) { MULADDC_INIT MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_STOP } for (; i>0; i--) { MULADDC_INIT MULADDC_CORE MULADDC_STOP } T++; 执行{ *d += c;c =(*d < c);d++; } while (c!= 0); }
(mbedtls_MPI_uint 是 uint32_t)
这是扩展 asm 代码:
#define MULADDC_INIT \ asm (\ "LDR r0、%3 \n\t"\ "LDR R1、%4 \n\t"\ "LDR R2、%5 \n\t"\ "LDR R3、%6 \n\n" #define MULADDC_CORE \ "LDR R4、[r0]、#4 \n\t"\ "MOV R5、#0 \n\t"\ "LDR R6、[R1] \n\t"\ " Uullal R2、R5、R3、R4 \n\t"\ "添加了 r7、r6、r2 \n\t"\ "ADC R2、R5、#0 \n\t"\ "STR r7、[R1]、#4 \n\n" #define MULADDC_STOP \ "STR R2、%0 \n\t"\ "STR R1、%1 \n\t"\ "STR r0、%2 \n\t"\ :"=m"(c)、"=m"(d)、"=m"(s) \ :"m"(s)、"m"(d)、"m"(c)、"m"(b)\ :"r0"、"r1"、"r2"、"r3"、"R4"、 "R5"、\ "R6"、"r7"、"cc" \ );
这是 C 代码:
#define MULADDC_INIT \{ \ mbedtls_MPI_uint s0、s1、b0、b1; \ mbedtls_MPI_uint r0、r1、rx、ry; \ B0 =(b <<波黑>>波黑; \ B1 =(b >> BH); #define MULADDC_CORE \ S0 =(*s <<波黑)>>波黑; \ S1 =(*s >>波黑);S++; \ Rx = s0 * b1;r0 = s0 * b0; \ ry = s1 * b0;r1 = s1 * b1; \ r1 +=( rx >>波黑); \ R1 +=( ry >> BiH ); \ Rx <=波黑;ry <=波黑; \ R0 += Rx;R1 +=(r0 < Rx); \ R0 += ry;R1 +=(r0 < ry); \ r0 += c;r1 +=(r0 < c); \ R0 +=*d;R1 +=(r0 <*d); \ C = R1;*(d++)= r0; #define MULADDC_STOP \}
第一步是尝试更换最后一个部件。 因此、我将所需的变量定义为全局变量、以便在汇编器代码中使用它们。
更改了 C 代码的最后一部分:
S_GLO = s; D_GLO = d; b_GLO = b; c_GLO = c; for (; i>0; i--) { test_funktion(); } b = b_GLO; C = c_GLO;
更改了汇编器代码:
.text .global s_GLO s_GLO_add.uword s_GLO .global d_GLO .global b_GLO b_GLO_add.uword b_GLO .global c_GLO_add .uword c_GLO .global test_GLktion test_funktion:push {R4-Rd_GLO_add_Rd_LDR_gr_r_gr2、r2_r2、r1_gld_gr2、r2、r2_gr3 启动 MULADDC_CORE LDR R4、[r0]、#4 MOV R5、#0 LDR R6、[R1] umlal R2、 R5、R3、R4 添加了 r7、r6、R2 ADC R2、 R5、#0 str r7、[R1]、#4 ;End MULADC_CORE LDRR8、c_GLO_add str R2、[R8] LDRR8、d_GLO_add str R1、[R8] LDRR8、 S_GLO_add str R0、[R8] POP{R4-R11} BX LR d_GLO_add.uword d_GLO
遗憾 的是,代码不能按预期工作(C 代码和汇编程序代码完全不同),并且由于我对汇编程序没有任何经验,我不知道会留下什么错误。
希望有人能帮我解决这个问题。