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
我不知道为什么我之前看到了开销,但是使用外部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 语句的输出块中声明和描述变量,但它确实创建了我想要的汇编代码(无开销)。
| 归档时间: |
|
| 查看次数: |
2924 次 |
| 最近记录: |