GCC内联汇编中的"= w"是什么意思?

4nt*_*ine 4 c assembly gcc gnu-assembler

我发现asm内联汇编正在工作,我无法理解(链接):

// busy wait
__asm__ __volatile__ (
    "1: sbiw %0,1" "\n\t" // 2 cycles
    "brne 1b" : "=w" (us) : "0" (us) // 2 cycles
);
Run Code Online (Sandbox Code Playgroud)

我已经发现了一些气体教程像这样,但我无法找到解释.无论如何,文件可以由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"是什么意思呢?

Kon*_*rov 6

它是输出约束.等号表示"将写入".字母w表示AVR"从r24到r31的寄存器".在这里查找特定于机器的约束描述.

编译器在寄存器分配通道上使用约束本身,以便分配正确的寄存器(在这种情况下 - 完全是这样,可以参与sbiw操作).如果你指定了错误的约束,gcc可能会为sbiw分配错误的寄存器,这会产生错误的输出汇编等.


jww*_*jww 6

"="意味着它的输出."w"是一种约束.答案部分见于GCC手册,部分见于2012年海湾合作委员会办理登机手续.

6.43.3.1手册的简单约束中:

其他字母可以以机器相关的方式定义,以代表特定类别的寄存器或其他任意操作数类型.'d','a'和'f'在68000/68020上定义为代表数据,地址和浮点寄存器.

这是添加约束的签到:[Patch,AVR]:添加"w"约束替代addhi3.这是办理登机手续的评论:

这个补丁为*addhi3和addhi3_clobber添加了一个"w"替代,以便为"w"类投票.这类似于版本4.6的orgiginal addhi3 insn.并且在addhi3_clobber中没有更明确的投票给"l",它只是"r".
意图是更好地使用ADIW和SBIW指令.

所以"w"是AVR相关的约束.