2011-09-28 100 views
3

我有以下的汇编代码:是否有可能强制内联汇编代码中的特定寄存器?

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

感谢 杰克

回答

3

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

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

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

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

相关问题