我有以下汇编代码:

  __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吗?这样,我可以将循环计数减少1,这是ldi r25,0x00行使用的。

谢谢
插口

最佳答案

这个问题很旧,您肯定已经解决了,但是出于存档目的,让我回答:是的,可以。像这样声明__count:

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

瞧!使用GNU扩展名explicit register variables,您已经声明了C变量__count始终应放置在r16中的任何位置,包括ASM调用之外。

请注意,此声明应具有局部作用域,否则编译器将避免在其他函数中使用此寄存器。

09-04 15:52