【发布时间】: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 和直接操作数的组合。