编译时asm中不可能的约束

在我的Atmel ASF项目中,我正在尝试构建以下内联asm代码。 但是我在编译时遇到了不可能的限制。

编译器指向此行__asm__ __volatile__ ,我错过了什么?

 #define OUTPORT PORTD #define OUTBIT 3 // PD.3 uint8_t rport ,rbits; uint8_t *buf = message; asm volatile( "in __tmp_reg__, __SREG__ \n\t" // 1 Save SREG for later "cli \n\t" // 1 Clear interrupts "in %[rport], %[port] \n\t" // 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语法是不正确的? 我一直在关注这本手册

ATxmega128A4U上的PORTD位于地址0x0660,如其数据表 (第62页)中所述。因此,该指令无法访问该端口。 您应该使用带有约束的lds代替

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

注意小写的“i”。

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

 #include  void test(void) { uint8_t rport; asm volatile( "in __tmp_reg__, __SREG__ \n\t" "cli \n\t" "lds %[rport], %[port] \n\t" : [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”。