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:是否为"常数发生器"访问实际上不是"寄存器模式"操作数?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/758996/msp430f5359-are-constant-generator-accesses-really-not-register-mode-operands

器件型号:MSP430F5359

人员:

我正在使用 IAR 的 icc430 C 编译器及其内联汇编器。 我注意到这个工具标记
以下指令不符合"RPT"(重复)操作的条件、因为
工具认为对常数发生器寄存器(R2和 R3)的访问不是
"寄存器模式"操作数。

0018 4E53  ADDX.A #0x0、R14  // src:模式0中为 R3/CG2、dst:模式0中为 R14
0018 5E53  ADDX.A #0x1、R14  // src:模式1中为 R3/CG2、dst:模式0中为 R14
0018 6E53  ADDX.A #0x2、R14  // src:模式2中的 R3/CG2、dst:模式0中的 R14
0018 6E52  ADDX.A #0x4、R14  // src:R2/SR/CG1 in 模式2、dst:R14 in 模式0
0018 7E52  ADDX.A #0x8、R14  // src:R2/SR/CG1 in 模式3、dst:R14 in 模式0
0018 7E53  ADDX.A #0x-1、R14  // src:模式3中的 R3/CG2、dst:模式0中的 R14

(错误打印输出包括在下面)

使用常数发生器确实会使指令不合格
还是 IAR 在这里具有过度限制?

Atlant

==================================================================-

编译:hello.cpp -> hello.R43

asm ("ADDX.A #0、R14");//:
^μ A
"Hello.CPP"、543 Error[Og006]:内联汇编中的错误:"ERROR[459]:重复指令必须具有寄存器模式操作数"

asm ("ADDX.A #1,R14");//:
^μ A
"Hello.CPP"、546错误[Og006]:内联汇编中的错误:"ERROR[459]:重复指令必须具有寄存器模式操作数"

asm ("ADDX.A #2、R14");//:
^μ A
"Hello.CPP"、549 Error[Og006]:内联汇编中的错误:"ERROR[459]:重复指令必须具有寄存器模式操作数"

asm ("ADDX.A #4, R14");//:
^μ A
"Hello.CPP"、552 Error[Og006]:内联汇编中的错误:"ERROR[459]:重复指令必须具有寄存器模式操作数"

asm ("ADDX.A #8、R14");//:
^μ A
"Hello.CPP"、555 Error[Og006]:内联汇编中的错误:"ERROR[459]:重复指令必须具有寄存器模式操作数"

asm ("ADDX.A #-1、R14");//:
^μ A
"Hello.CPP"、558 Error[Og006]:内联汇编中的错误:"ERROR[459]:重复指令必须具有寄存器模式操作数"

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

    如果您手动生成机器码、它是否正确执行?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    克莱明:

    >我在 CPU 文档中找不到这样的限制。

    谢谢--我同意!

    >如果手工生成机器码,是否正确执行?

    这将是我的下一步。 我现在尝试一下、然后报告。

    Atlant

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

    >>如果您手动生成机器码,是否正确执行了?

    >这将是我的下一步。 我现在尝试一下、然后报告。

    我不知道如何强制 IAR 生成任意十六进制操作码、但我可以编辑生成的加载文件、因此我使用立即(#n)重复计数和提供重复计数的寄存器来执行实验。 事实证明、在所有情况下、IAR 编译器都是正确的:如果将常数发生器寄存器指定为源寄存器、通常需要重复该操作的扩展字将被忽略。 该操作正常进行、但仅执行一次。

    我想我还想听到 TI 说这是预期的行为(对于所有 MSP430X 处理器)、但除此之外、这个问题已经解决。 我想我会向 TI 提交一个文档错误、说明这种行为没有记录;他们可以更清楚地知道什么是"寄存器模式"操作数。

    Atlant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Atlanta,
    对于您遇到的不便、我们深表歉意。
    请允许我澄清这种情况。 具有 CPUx -X 命令的 CG 仍是一个寄存器操作。 但是、对于指令的-X 版本、寄存器操作需要更多的一个周期。 例如、ADD R13、R14需要一个周期、如 ADD #01h、R14、但 ADDX R13、R14同样需要 ADDX #01h、R14需要2个 CPU 周期。 因此、借助扩展地址范围指令、CG 可为您节省一个 CPU 周期。

    此致
    Peter