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.

[参考译文] MSP430-GCC-opensource:在内联汇编中指定 clobber 寄存器

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/793893/msp430-gcc-opensource-specifying-clobber-registers-in-inline-assembly

器件型号:MSP430-GCC-opensource

您好!

我正在尝试弄清楚如何在中指定 clobber 寄存器
内联汇编代码段。  以下代码:

void foo (void)
{
__ASM__ volatile (
"MOV.b R9、R10"
:
:
:“R10”
);
}

…μ A 编译良好、可以使用我的提供的 gcc-msp430封装
分发(Ubuntu 16.04)、即使用以下命令:

msp430-gcc -c -mmcu=msp430f1611 foo.c 

但是、当我尝试使用 TI 的编译器执行以下命令时:

$INSTALL_DIR/MSP430-gcc/bin/MSP430-elf-gcc -c -mmcu=msp430f1611 -L$INSTALL_DIR/MSP430-gcc/support-files/include/-i$INSTALL_DIR/msp430-gcc/support-files/include/foo.c -T msp430f1611.ld 

我得到以下错误:

foo.c:在函数'foo'中:
foo.c:5:5:错误:'asm'中未知的寄存器名称'r10'
__ASM__ volatile (
^~~~~~~μ A
foo.c:5:5:错误:'ASM'中的未知寄存器名称'R9' 

我出了什么问题? 我是否错过了文档中的内容
解释了为什么这些寄存器不能在 clobber 子句中使用?

提前感谢您的帮助。


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

    感谢您使用 MSP430器件。 我们的团队成员将检查您的问题并在稍后回复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Kevin:
    很抱歉耽误你的时间。 我们的专家因复活节假期而不在办公室。 不幸的是,我们甚至需要一些额外的时间来吸引其他人,他们可能对此有一个答案。
    我会随时向您通报最新情况、并在接下来的几天内回复您。

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

    您好!

    要在 clobber 列表中指定寄存器、请使用大写的"R"表示寄存器名称。 因此、代码中的"R10"而不是"R10"。

    GCC 发出的错误消息肯定会更清晰。 我们的目标是在未来的版本中对此进行改进。

    此致、

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

    谢谢你 Josef! 在 clobber 列表中将"R10"替换为"R10"确实允许使用 TI 的编译器编译代码(尽管它会导致 DEBIA/Ubuntu 的编译器失败)。

    由于小写拼写在汇编模板本身中起作用、因此整个过程尤其复杂、即这种编译很好:

    void foo (void)
    {
    __ASM__ volatile (
    "MOV R9、R10" /*小写*/
    :
    :
    :“R10” /*大写*/
    );
    }
    

    对错误消息的澄清(和/或手册的补充)肯定是值得欢迎的!

    感谢你的建议。

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

    是的、可以理解的是、当来自旧的 mspgcc 工具链时、预期语法的更改可能会令人困惑。 遗憾的是、在 asm 语句中只允许使用一种方法来指定特定的寄存器、由于工具链已经发布了几年、我们现在无法将其改回。

    需要注意的是、Ubuntu 上的旧默认 mspgcc 工具链与 TI 发布的新 MSP430-GCC 工具链之间存在其他显著差异。 新的 MSP430-GCC 工具链遵循 MSPABI、而 mspgcc 工具链具有自己独特的 ABI。

    《MSP430-GCC 用户指南》(slau646)的第6节"MSP430 GCC 和 MSPGCC" 提供了有关它们之间差异的一些其他详细信息、尤其是与调用惯例相关的信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    男士、
    问题解决后、我将关闭该线程。

    此致
    Peter