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

4

我找到了一段工作正常但我无法理解的内嵌汇编代码(链接):

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

我找到了一些类似这个的gas教程,但是我找不到解释。无论如何,该文件可以通过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.c.o

那么GCC内联汇编中的“=w”是什么意思?

2个回答

7

这是输出约束。等号表示“将值写入”。字母w表示AVR中的“r24到r31寄存器”。在此查看以查找特定机器约束的描述。

编译器在寄存器分配过程中使用约束本身,以便分配正确的寄存器(在这种情况下--确切地说是可以参与sbiw操作的寄存器)。如果您指定了错误的约束,则gcc可能会为sbiw分配错误的寄存器,从而产生错误的汇编输出等。


6
""="" 表示它是输出。""w"" 是一个约束条件。答案部分在 GCC 手册中找到,部分在 2012 年的 GCC check-in 中找到。
在手册的 6.43.3.1 简单约束条件 中:
其他字母可以以机器相关方式定义,以表示特定类别的寄存器或其他任意操作数类型。“d”、“a”和“f”在 68000/68020 上被定义为数据、地址和浮点寄存器。
这是添加约束条件的 check-in:[Patch,AVR]: Add "w" constraint alternative to addhi3。以下是该 check-in 的注释: "
这个补丁在*addhi3和addhi3_clobber中添加了一个"w"选项,以投票支持"class w"。这类似于版本4.6之前的orgiginal addhi3指令。addhi3_clobber中不再有针对"l"的明确投票,只有"r"。 目的是更好地使用ADIW和SBIW指令。 因此,"w"是与AVR相关的约束条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接