工具与软件:
背景:我比较熟悉 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 环境更方便。