【问题标题】:Why odd operand error when compiling assembly?为什么编译程序集时出现奇怪的操作数错误?
【发布时间】:2020-07-17 18:50:43
【问题描述】:

学习汇编和阅读有关 msp430 上的 BIT 指令。 尝试编译此代码时:

int main (void)
{
  while(1){
    __asm__("BIT R2, 3");
  }

   return 0;
}

上面写着:error: odd operand: -3

然而,当写 __asm__("BIT.B R2, 3"); 时,它可以工作。

有人能解释一下吗?

【问题讨论】:

  • 首先,这不是使用内联汇编的安全方式。修改通用寄存器而不告诉编译器会导致问题。 2,您是否查看了BIT 指令的手册?大概它不能用奇怪的立即数编码。这似乎是汇编程序错误消息告诉您的内容。
  • @PeterCordes 是的,我确实阅读了有关 ISA 的文档,但我仍然不清楚为什么它不能编译。我读了this doc from TI (page 5-6)this page about the x86 equivalent。好的,这是不可编码的......但是为什么?我看不出是什么禁止这样做。最后,我究竟应该告诉编译器“安全”什么?
  • 为了安全起见,您需要 gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html 带有输入/输出约束,以将您的 asm 连接到 C 变量。
  • x86 指令与 MSP430 的功能完全无关。请注意,MSP430 使用op src, dst,所以我认为bit r2, 3 是具有奇数字地址的内存目标指令。 MSP430 是否需要对齐的内存操作数?这可以解释为什么它允许地址 3 用于单字节版本而不是单词版本。
  • 认为你想要ti.com/sc/docs/products/micro/msp430/userguid/ag_05.pdf而不是.../as_05.pdf。我现在正在看。我已经发现 R2 和 R3 有特殊的属性;这里的问题可能是 R2 和直接操作数的组合,而不是 BIT 和直接操作数的组合。

标签: c assembly msp430


【解决方案1】:

指令BIT R2, 3 正在对目标地址(即程序计数器的偏移量)使用符号模式。如果要使用立即值3,则必须使用BIT R2, #3

使用BIT 而不是BIT.B 失败的原因是BIT 进行了字操作,而您使用的是非法的奇数地址。在 MSP430 中,字操作必须是字对齐的(即偶数地址)。字节操作可以对任何字节地址进行操作,奇数或偶数。

如果您阅读您正在使用的 MCU 系列的用户指南,您可以获得相当详细的信息。例如,对于 MSP430x2xxx 系列,您需要阅读 https://www.ti.com/lit/ug/slau144j/slau144j.pdf 文档的第 3 章或第 4 章,具体取决于您的 MCU 是否具有较新的 20 位地址内核。

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2011-11-23
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多