3

我有以下汇编代码:

  __asm__ __volatile__ (
  "1: subi %0, 1"        "\n\t"
  "brne 1b"
  : "=d" (__count)
  : "M" (__count));

这导致以下编译器输出

  ce:   81 50           subi    r24, 0x01   ; 1
  d0:   f1 f7           brne    .-4         ; 0xce <main>
  d2:   80 e0           ldi r24, 0x00   ; 0
  d4:   90 e0           ldi r25, 0x00   ; 0

我怎样才能实现以下目标:

  ce:   81 50           subi    r16, 0x01   ; 1
  d0:   f1 f7           brne    .-4         ; 0xce <main>
  d2:   80 e0           ldi r16, 0x00   ; 0

甚至可以告诉编译器使用 r16 而不是 r24:r25?这样我可以将 ldi r25,0x00 线使用的循环计数减少 1。

谢谢杰克

4

2 回答 2

4

这个问题很老,你肯定已经解决了,但为了存档,让我回答一下:是的,你可以。像这样声明__count

register <type> __count __asm__ ("r16");

瞧!使用 GNU 扩展显式寄存器变量,您已声明 C 变量__count应始终放在 r16 中,无论它在哪里使用 - 包括在 ASM 调用之外。

请注意,此声明应具有本地范围,否则编译器将避免在其他函数中使用此寄存器。

于 2012-07-17T13:04:22.407 回答
0

看看这个:http ://www.nongnu.org/avr-libc/user-manual/inline_asm.html#io_ops

看来您不能强迫它使用特定的寄存器。但是,如果您使用"=a"而不是"=d"您将其限制为寄存器 r16..r23,这应该是您想要的(因为您只是不希望它使用“配对”寄存器 r24/r25)

于 2011-12-09T13:18:43.533 回答