c-编译时asm中的不可能约束



在我的Atmel ASF项目中,我正在尝试构建以下内联asm代码。然而,我在编译时遇到了不可能的约束。

编译器指向这一行CCD_ 1,我遗漏了什么吗?

#define OUTPORT PORTD
#define OUTBIT 3      // PD.3   
uint8_t rport ,rbits;
uint8_t *buf = message;
asm volatile(   "in     __tmp_reg__, __SREG__             nt" // 1  Save SREG for later
"cli                                      nt" // 1  Clear interrupts
"in     %[rport], %[port]                 nt" // 1  Move PORTB adress to rport
: //Outputs
[rport] "=&r" (rport)
: //Inputs
[port]    "I" (_SFR_IO_ADDR(OUTPORT))     // Adress to port register, 6-bit positive constant
: //Clobber list (compiler must restore)
"r0"                                       // This is __tmp_reg__
);
  1. 是什么破坏了这个构建
  2. 我想知道asm语法是否不正确?我一直在遵循本手册

PORTD,在ATxmega128A4U上,地址为0x0660,如数据表,第62页。因此,in指令无法访问该端口。您应该使用lds,并带有约束

[port]  "i" (_SFR_MEM_ADDR(OUTPORT))

注意小写字母"i"。

附录:我刚刚尝试编译以下内容:

#include <avr/io.h>
void test(void)
{
uint8_t rport;
asm volatile(
"in __tmp_reg__, __SREG__  nt"
"cli                       nt"
"lds %[rport], %[port]     nt"
: [rport] "=&r" (rport)               // output
: [port]  "i" (_SFR_MEM_ADDR(PORTD))  // input
: "r0"                                // clobber
);
}

使用avr gcc 4.9.2和选项-mmcu=atxmega128a4u -c,我得到生成的代码正确且没有警告,即使使用-Wall -Wextra

"i"约束是记录在案的表示"立即数整数操作数",而"I"方法"常数大于−1,小于64"。

最新更新