我发现asm内联汇编工作正常,我无法理解(link):
// busy wait
__asm__ __volatile__ (
"1: sbiw %0,1" "\n\t" // 2 cycles
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
);
我找到了一些像this这样的气体教程,但我无法找到解释。 无论如何,文件可以由avr-gcc编译:
/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avr-gcc -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu = atmega328p -DF_CPU = 16000000L -MMD -DUSB_VID = null -DUSB_PID = null -DARDUINO = 105 -I / Applications / Arduino.app / Contents / Resources / Java / hardware / arduino / cores / arduino -I / Applications / Arduino.app / Contents / Resources / Java / hardware / arduino / variants / standard /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/wiring.c -o /var/folders/64/fwfkm1k51zbd4_c5lwpsbljh0000gn/T/build5450310618632673119.tmp/ wiring.co
那么GCC内联汇编中的“= w”是什么意思?
答案 0 :(得分:6)
是输出约束。等号表示“将写入”。字母w表示AVR“从r24到r31的寄存器”。 Look here查找特定于机器的约束描述。
编译器在寄存器分配传递中使用约束本身,以便分配正确的寄存器(在这种情况下 - 完全是这样,可以参与sbiw操作)。如果你指定了错误的约束,gcc可能会为sbiw分配错误的寄存器,这会产生错误的输出汇编等。
答案 1 :(得分:6)
"="
表示其输出。 "w"
是一种约束。答案部分可在GCC手册中找到,部分可在2012年海湾合作委员会办理登机手续中找到。
在手册的6.43.3.1 Simple Constraints中:
其他字母可以依赖于机器的方式定义,以代表特定类别的寄存器或其他任意操作数类型。 'd','a'和'f'在68000/68020上定义为代表数据,地址和浮点寄存器。
这是添加约束的签到:[Patch,AVR]: Add "w" constraint alternative to addhi3。这是办理登机手续的评论:
此补丁为* addhi3和addhi3_clobber添加了“w”替代 为了投票“w”。这类似于orgiginal addhi3 insn到版本 4.6。并且在addhi3_clobber中没有更明确的投票给“l”,它只是“r”。
意图是更好地使用ADIW和SBIW指令。
所以“w”是与AVR相关的约束。