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.

[参考译文] MSP430F5359:TI##39;s CGT C/C++编译器/汇编器:内联 asm ()(汇编语言)如何访问 C/C++##39;s 变量?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1468404/msp430f5359-ti-s-cgt-c-c-compiler-assembler-how-does-inline-asm-assembly-language-access-c-c-s-variables

器件型号:MSP430F5359

工具与软件:

背景:我比较熟悉 IAR 的 icc430 C/C++编译环境、一位比较熟悉 TI CGT MSP430环境的新手。

在 IAR 中、如果我希望将一些内联汇编语言嵌入到其他 C/C++例程中、我可以这样说:

Checksum_T checksums::: computeChecksum ( uint32 const FirstByte44, Region_Address uint32 const RegionBytecount, Checksot_T const Seed )

  CHECKSUM_T CHECKSUM = SEED;
  U16ConstPointer20_T Byte_ptr        =(U16ConstPointer20_T) FirstByteECG Region_Address;
  uint32.               remainingWords = RegionBytecount / 2UL;

  while (remainingWords !=0UL)
  {
   Checksum +=* Byte_ptr;
   asm ("ADC.W %0")       /*将尾进位与累积校验和值相加(可以是%0或%1)*/
        :"=r"(校验和)  /*%0是我们的输出参数("校验和")                                       */
        :"r"(校验和)   /*%1是我们的输入参数("校验和")                                        */
        :"cc";           /*木结构资源列表(仅条件代码)                          */
   byte_ptr++;
   remainingWords --;
  }

  return(校验和);
}

%0、=r、r 和 cc 填充创建了一个与 C 编译器的接口、由此、C 编译器将汇编语言伪操作数%0设置为指向 C 的"校验和"数据值。 它还让 C 编译程序知道我的内联汇编代码会影响或破坏哪些资源、以便编译程序知道避免这些资源/从我这里保存/接受值。

通过浏览 SLAU132Y (CGT 编译器手册)和 SLAU131Y (汇编器手册)、我看不到任何类似的工具、因此看起来我需要读取汇编列表并自定义我的内联汇编代码以访问正确的资源(由 C/C++编译器确定)。 事实上、编译器手册指出我的问题是不可能的:

asm 语句不提供任何引用局部变量的方法。 非常有用
您需要引用局部变量、那么您需要在汇编代码中编写整个函数。

及更高版本:

使用 asm 语句时不要改变 C/C++变量的值。 这是因为
编译器不会验证此类语句。 它们将原样插入汇编代码、和中
如果您不确定它们的效果、可能会导致问题。

虽然我可以想象、如果我愿意接受某种风险、编译器可以将事情"背后"(恕不另行通知)、我仍然可以编写我建议的代码。

我是否正确理解情况? 如果 CGT 中不存在该功能、也可以、但在 IAR 环境中实现比 CGT 环境更方便。

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

    您好、Atlant:

    通常情况下、为了避免编译器扰乱我的代码、我将显式定义不被编译器调整的函数和变量。 您可以对变量本身使用 volatile 关键字、以防止它被优化掉  

    另一个选项是也防止优化整个函数、请参阅类似的线程- https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/570641/compiler-msp430f147-how-do-i-turn-the-optimizer-off-for-a-specific-function 

    本应用手册还将帮助填补某些此类链接方面的空白(以及几个代码示例)- https://www.ti.com/lit/slaa140 

    此致、
    Luke

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

    "asm"接受"volatile"关键字[例如 asm volatile (" nop ");]但我不知道它是否有任何效果。  

    我还没有尝试您提到的 GCC 样式参数化的 TI 编译器。

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

    感谢您指出 IAR asm 语法实际上是 GCC 语法;我应该猜到了这一点、但没想到。 ;-)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还没有尝试使用 TI 编译器提及的 GCC 样式参数化。

    我只是尝试了一下。

    对于包含  asm ("ADC.W %0")的行、CGT 编译器(在大多数默认模式下运行)如下:

    "hello.c"、第294行:错误:预期为")"

    因此、除非某些限定符可以更改此行为、否则 CGT 编译器不愿意接受此 GCC 语法。

    (我还在 GCC 中尝试过它、在这种环境下、它起作用了。)

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

    您好、Atlant:

    您是否能够对您的函数应用 no 优化、并将正在使用的变量设置为未优化? -  

    #pragma FUNCTION_OPTIONS (FUNCTION_NAME、"-opt_level=OFF") 

    在这个情况下、编译程序不应该调整函数、我希望此函数会允许您的__asm 将430指令应用到数据中。

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

    路加福音:

    我还没有尝试过、但我有理由相信您是正确的、设置"不优化"将有助于解决这种情况。

    现在、我的问题至少部分是理论问题;我正在考虑将我们的代码库(或其中的部分)从 IAR 环境移植到 CGT 环境会采取什么措施、而汇编代码位是到目前为止我注意到的唯一绊脚石。 到目前为止我实验移植的代码除了 makefile 以及(预期的)编译器和链接器限定符之外、无需调整。

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

    听起来不错! 我现在将关闭该线程、但如果您在进行移植时遇到任何困难、可以随意创建另一个线程。