This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/F28M35H52C:将内联扩展 asm 转换为独立 asm

Guru**** 2382480 points
Other Parts Discussed in Thread: F28M35H52C
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/701095/compiler-f28m35h52c-convert-inline-extended-asm-to-standalone-asm

器件型号:F28M35H52C

工具/软件: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 代码和汇编程序代码完全不同),并且由于我对汇编程序没有任何经验,我不知道会留下什么错误。

 

希望有人能帮我解决这个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这超出了我们通常在论坛上处理的范围。   

    可以将使用 GCC ARM 工具链构建的代码与 TI ARM 工具链构建的代码相结合。  您是否考虑采用这种方式?

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否尝试使用 GCC ARM 工具链?  如果是、情况如何?

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的乔治:

    我们在最后一天尝试使用 GCC ARM 工具链、但遗憾的是没有成功。

    我们将尝试了解如何更改 asm 命令、以便独立 asm 和扩展 asm 也可以这样做。 任何帮助仍然是非常欢迎的。

    感谢您的建议、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     假设 大数字乘法库是使用 GCC ARM 编译器构建的。  其他所有内容都是使用 TI ARM 编译器构建的。  然后、它都与 TI ARM 连接器链接在一起。  你在干什么?  如果没有、请以类似的方式描述您的构建过程。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    将 C 文件(即使是具有嵌入式汇编代码的文件)转换为汇编代码的最简单方法是使用编译器。
    如果可能、使用"-S"选项运行 GCC ARM 编译器。 这将生成汇编输出文件。
    此汇编文件将具有 GNU 指令、因此无法直接将其馈送到 TI 汇编器、但指令的格式完全相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因为已经有一段时间了,我想你已经解决了这个问题。  如果您能描述您是如何解决的、我将不胜感激。

    谢谢、此致、

    乔治