Можно ли форсировать определенные регистры во встроенном коде сборки? - PullRequest
3 голосов
/ 29 сентября 2011

У меня следующий код сборки:

  __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.

Спасибо Jack

Ответы [ 2 ]

3 голосов
/ 17 июля 2012

Этот вопрос старый, и вы наверняка уже решили его, но для целей архивации позвольте мне ответить на него: да, вы можете.Объявите __count вот так:

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

И вуаля!Используя расширение GNU явные переменные регистра , вы объявили, что переменная C __count всегда должна быть помещена в r16, где бы она ни использовалась - в том числе вне вызова ASM.

Обратите внимание, что это объявление должно иметь локальную область видимости, иначе компилятор не будет использовать этот регистр в других функциях.

0 голосов
/ 09 декабря 2011

Проверьте это: http://www.nongnu.org/avr-libc/user-manual/inline_asm.html#io_ops

Кажется, вы не можете заставить его использовать определенный регистр.Однако, если вы используете "=a" вместо "=d", вы ограничите его регистрами r16..r23, которые должны быть именно такими, как вы хотите (потому что вы просто не хотите, чтобы они использовали «парные» регистры r24 / r25)

...