编译时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__ );
- 什么在摧毁这个版本?
- 我想知道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”。