AVR sbi命令 - 错误:数字必须为正且小于32

Cro*_*ent 3 assembly avr avr-gcc

我花了很长时间用我的AVR开发系统设置了完整的GCC工具链(一切都是最新的当前稳定版本),我用它解决了大多数问题.

以下代码给出了一个我没有得到的错误.AVR汇编手册指出sbi指令可以接受0-7作为常量表达式,但它仍然在我身上出错.谁能解释为什么这样做呢?

  #ifndef __AVR_ATmega168__
      #define __AVR_ATmega168__
  #endif

  #include <avr/io.h>

      rjmp Init

  Init:

      ser r16
      out DDRB, r16
      out DDRD, r16

      clr r16

      out PORTB, r16
      out PORTD, r16

  Start:

      sbi PORTB, 0
      rjmp Start
Run Code Online (Sandbox Code Playgroud)

有问题的线是sbi PORTB,0.

编译/组装:

avr-gcc ledon.S -mmcu = atmega168

ndi*_*dim 6

更新事实证明,在使用avr-libc时,您应该像这样编写汇编代码:

#include <avr/io.h>
sbi  _SFR_IO_ADDR(PORTB), 0
Run Code Online (Sandbox Code Playgroud)

[已删除调试提示,没有实际解决方案]