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.

[参考译文] CCSTUDIO:C 和汇编代码混合

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1629908/ccstudio-intermixing-c-and-assembly-code

部件号: CCSTUDIO

我使用的是 TMS320x28335 处理器及其相关工具。

我正在尝试将堆栈中的值保存到“C"语言“语言变量中。 我使用内联汇编、如下所示:

 

无符号长整型 retAddr;

 

ASM(“POP @AH“);

ASM(“{POP @AL“);

asm(“MOVL @ RetAddr、ACC“);

 

累加器未按照我的预期存储在 RetAddr 中。 我在做什么?

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

    尊敬的 Gail:

    对我延迟的回复表示歉意。 以下几点:

    • POP @AH并且{POP @AL不是有效的 C28x 指令。 @前缀表示间接寻址、不作为 POP 目标有效。 我还假设 {第二个 POP 中的杂散是一个拼写错误。 实际上、您根本不需要两个单独的 POP。 C28x 指令集提供了一条单POP ACC指令、可在一次运算中将完整的 32 位值从堆栈直接弹出到累加器中。 由于无效的 POP 指令从不会实际加载堆栈中的任何内容、因此后续MOVL操作会将任何垃圾值存储在 ACC 中。
    • MOVL @_RetAddr, ACC能够写入正确的存储器位置之前、必须显式设置数据页指针 (DP) 以指向 RetAddr 变量。 如果不执行此步骤、MOVL 指令就不会存储到正确的地址、即使 ACC 包含正确的值也是如此。

    您可以尝试将代码更改为:

    unsigned long RetAddr;
    asm("POP ACC");
    asm("MOVW DP, #_RetAddr");
    asm("MOVL @_RetAddr, ACC");

    此致、

    Delaney

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

    谢谢、Delaney。 就解决了问题。