是否有可能强制内联汇编代码中的特定寄存器?
问题描述:
我有以下的汇编代码:是否有可能强制内联汇编代码中的特定寄存器?
__asm__ __volatile__ (
"1: subi %0, 1" "\n\t"
"brne 1b"
: "=d" (__count)
: "M" (__count));
这将导致以下编译器ouptut
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。
感谢 杰克
答
这个问题很老,你肯定已经解决了它,但为了存档的目的,让我回答它:是的,你可以。声明__count
这样的:
register <type> __count __asm__ ("r16");
和瞧!使用GNU扩展explicit register variables,你已经声明C变量__count
应该始终放在r16中,无论它在哪里使用 - 包括在ASM调用之外。
请注意,此声明应具有本地范围,否则编译器将避免在其他函数中使用此寄存器。
答
看看这个:http://www.nongnu.org/avr-libc/user-manual/inline_asm.html#io_ops
看来你不能强迫它使用一个特定的寄存器。但是,如果你使用的"=a"
代替"=d"
你会限制它注册r16..r23这应该是你想要的(因为你只是不希望它使用“配对”寄存器R24/R25)