c - avr内联汇编错误: impossible constraint

标签 c assembly inline-assembly avr

#include <avr/io.h>

int main(void){

    asm volatile("ldi r16, %0\n\t"
                 "out %1, r16\n\t"
                 "ldi r16, %0\n\t"
                 "out %2, r16\n\t"::"M" (0xff),"I" (_SFR_IO_ADDR(DDRB)),"I" (_SFR_IO_ADDR(PORTB)));

    while(1) {
        asm volatile("cbi %0, %1\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "nop\n\t"
                     "sbi %0, %1\n\t"::"I" (SFR_IO_ADDR(PORTB)), "M" (0xff));
    }
}

编译时:错误:不可能的约束 指针设置到asm语句位置:11-9 (asm volatile("cbi %0, %1\n\t")

但是为什么呢?

最佳答案

您缺少 SFR_IO_ADDR(PORTB) 上的前导下划线,因此它被编译为对返回整数的外部函数的调用。如果您启用了警告,您会看到以下内容:警告:函数“SFR_IO_ADDR”的隐式声明

关于c - avr内联汇编错误: impossible constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23456661/

相关文章:

c - 使用外部指针声明外部函数时出错

c++ - 程序集用寄存器值替换常量

c++ - 在 Linux 中使用 C++ 中的内联汇编是否有比 GCC 或 Clang 实现更直观的方法?

C++ 内联程序集运行时检查失败 #0

c - 在 PIC32 上的 HiTech C 中设置函数指针的中断安全方法

c - 从麦克风插头获取原始信号

c - 为什么需要转换字符?

c++ - 使用 typedef 作为变量名不会产生任何错误

c++ - 尝试在 cpp 模块中使用汇编代码时出现链接器错误

c - %q 在内联汇编中与 -arch i386