【问题标题】:Is it possible to force particular registers in inline assembly code?是否可以在内联汇编代码中强制特定寄存器?
【发布时间】:2011-09-28 22:40:10
【问题描述】:

我有以下汇编代码:

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

谢谢 杰克

【问题讨论】:

    标签: avr avr-gcc


    【解决方案1】:

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

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

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

    注意这个声明应该有局部作用域,否则编译器会避免在其他函数中使用这个寄存器。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-03-24
        • 1970-01-01
        • 2017-12-23
        • 2019-12-10
        • 2014-11-21
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多