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.

[参考译文] TMS570LC4357:创建伪指令的说明?

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223049/tms570lc4357-description-of-cret-pseudo-instruction

器件型号:TMS570LC4357

团队、

我们是否有关于编译器正在生成的 Cret 指令的任何详细信息? 似乎是一个导致分支(b)指令的伪指令。 但我找不到任何关于克雷特的描述。 我的一位客户正在进行安全认证、他们需要记录/认证所有生成的代码。 因此,重要的是要知道 Cret 是否总是产生一个分支.  

例如、对于 以下 C 代码、编译器生成使用 Cret 调用 some_func_...的汇编代码:

void f(void)
{
   if(glob_var_1_boolean)
   {
      some_func_1();
   }
   else
   {
      some_func_2();
   }
}

客户正在使用具有以下选项的 TI ARM C/C++编译器 v20.2.1.LTS:

--abi=eabi --arm_vmrs_si_workaround=off --code_state=16 --diag_wrap =off --embedded_constants=on --endian=big --float_support=VFPv3D16 --hll_source=on --object_format=elf --silicon_version=7R5 --symdebug:dwarf=unaligned_version=on------dwarmodebug_dwarf_version=on-unaligned_access

谢谢。
 罗伯特

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

    尊敬的 Robert:

    我们已着手解决您的问题、并将很快提供更新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="7122" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223049/tms570lc4357-description-of-cret-pseudo-instruction ]我们有没有关于编译器正在生成的 Cret 指令的详细信息? 似乎是一个导致分支(b)指令的伪指令。 [/报价]

    正确。  详细信息...

    当我使用显示的选项构建该示例代码时、我没有看到 创建 学习指令。  我看到以下...

    f:
    ;* --------------------------------------------------------------------------*
            PUSH      {A4, LR}              ; [DPU_V7R4_PIPE0]
            LDR       A1, $C$CON1           ; [DPU_V7R4_PIPE0] |6|
            LDR       A1, [A1, #0]          ; [DPU_V7R4_PIPE0] |6|
            CBZ       A1, ||$C$L1||         ; []
            ; BRANCHCC OCCURS {||$C$L1||}    ; [] |6|
    ;* --------------------------------------------------------------------------*
            BL        some_func_1           ; [DPU_V7R4_PIPE1] |8|
            ; CALL OCCURS {some_func_1 }     ; [] |8|
            B         ||$C$L2||             ; [DPU_V7R4_PIPE1]
            ; BRANCH OCCURS {||$C$L2||}      ; []
    ;* --------------------------------------------------------------------------*
    ||$C$L1||:
            BL        some_func_2           ; [DPU_V7R4_PIPE1] |12|
            ; CALL OCCURS {some_func_2 }     ; [] |12|
    ;* --------------------------------------------------------------------------*
    ||$C$L2||:
            POP       {A4, PC}

    默认情况下、编译器会删除自动生成的汇编文件。  但我使用选项 - keep_asm. 禁用该行为。  我对输出进行了滤波、以便删除调试指令和空白行。   

    请注意 指令使寄存器入栈 A4 左侧 。  左侧 包含返回地址。  此函数调用由实现 BL 指令、它将返回地址加载到中 左侧 。  。 弹出 指令无法弹回 左侧 而是进入了 个人电脑 但是。  这就是返回到调用方的方式。

    现在、以相同的方式执行所有操作、但添加选项 -- opt_level=3. 在3级进行优化。  现在汇编代码是...

    f:
    ;* --------------------------------------------------------------------------*
            LDR       A1, $C$CON1           ; [DPU_V7R4_PIPE0] |6|
            LDR       A1, [A1, #0]          ; [DPU_V7R4_PIPE0] |6|
            CBNZ      A1, ||$C$L1||         ; []
            ; BRANCHCC OCCURS {||$C$L1||}    ; [] |6|
    ;* --------------------------------------------------------------------------*
            CRET      some_func_2           ; [DPU_V7R4_PIPE1] |12|
            ; CALL OCCURS {some_func_2 }     ; [] |12|
    ;* --------------------------------------------------------------------------*
    ||$C$L1||:
            CRET      some_func_1           ; [DPU_V7R4_PIPE1] |8|
            ; CALL OCCURS {some_func_1 }     ; [] |8|

    注意否 弹出 学习指令。  该调用通过实现 创建 这只是另一种拼写方法 b. (分支)指令。  因为 左侧 永不改变、函数被调用( somore_func_1 somore_func_2 )返回不到 f 而是对的呼叫者 f 。  为了便于查看正在进行的这种特定优化、指令 创建 (调用返回)被发射、即使是 a b. (分支)是非常相同的指令。

    谢谢。此致、

    -George.