我有以下汇编代码:
__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?这样我可以将循环计数减少1,这是ldi r25,0x00行使用的。
由于 千斤顶
答案 0 :(得分:3)
这个问题已经过时了,你肯定已经解决了这个问题,但是为了归档,让我回答一下:是的,你可以。像这样声明__count
:
register <type> __count __asm__ ("r16");
瞧!使用GNU扩展explicit register variables,您已声明C变量__count
应始终放在r16中的任何位置 - 包括ASM调用之外。
请注意,此声明应具有本地范围,否则编译器将避免在其他函数中使用此寄存器。
答案 1 :(得分:0)
看看这个:http://www.nongnu.org/avr-libc/user-manual/inline_asm.html#io_ops
似乎你不能强迫它使用特定的寄存器。但是,如果您使用"=a"
而不是"=d"
,则会将其限制为寄存器r16..r23,这应该是您想要的(因为您不希望它使用'配对'寄存器r24 / R25)