GCC 内联汇编:让编译器决定将哪个寄存器用于临时值

THX*_*138 5 gcc avr inline-assembly avr-gcc

我需要加载 18h 并将其输出到端口 60h,以下工作(在 asm("") 内)。

ldi r1, 0x18 ; 0x18 -> r1
sts 0x60, r1 ; output r1 -> 0x60
Run Code Online (Sandbox Code Playgroud)

我不在乎寄存器 r1 或其他任何用于此目的。有没有一种简单的方法让编译器决定使用哪个寄存器?

我可以使用外部 r/w 变量,但它会产生一些不必要的开销:

register uint8_t tmp;
asm volatile (
    "ldi %[tmp], 0x18 \n\t"
    "sts 0x60, %[tmp]"
    : [tmp] "=r"(tmp) :);
Run Code Online (Sandbox Code Playgroud)

这是用于 AVR atmega(8 位)处理器。使用 GCC 4.3.2

THX*_*138 2

我不知道为什么我之前看到了开销,但是使用外部register临时变量即使使用 -O0 (无优化)也没有开销。所以我正在使用:

register uint8_t tmp;
asm volatile (
    "ldi %[tmp], 0x18 \n\t"
    "sts 0x60, %[tmp]"
    : [tmp] "=r"(tmp) :);
Run Code Online (Sandbox Code Playgroud)

它仍然需要在 asm 语句的输出块中声明和描述变量,但它确实创建了我想要的汇编代码(无开销)。