什么" = w"在GCC内联汇编意味着什么?

时间:2014-12-26 07:23:43

标签: c gcc assembly gas

我发现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”是什么意思?

2 个答案:

答案 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相关的约束。

相关问题