【问题标题】:What does "=w" in GCC Inline Assembly mean?GCC 内联汇编中的“=w”是什么意思?
【发布时间】:2014-12-26 07:23:43
【问题描述】:

我发现 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/接线.c.o

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

【问题讨论】:

    标签: c gcc assembly gnu-assembler


    【解决方案1】:

    是输出约束。等号表示“将写入值”。字母 w 表示 AVR“从 r24 到 r31 的寄存器”。 Look here 查找特定于机器的约束描述。

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

    【讨论】:

      【解决方案2】:

      "=" 表示它的输出。 "w" 是一个约束。部分答案可在 GCC 手册中找到,部分答案可在 2012 GCC check-in 中找到。

      在手册的6.43.3.1 Simple Constraints中:

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

      这是添加约束的签入:[Patch,AVR]: Add "w" constraint alternative to addhi3。这是签到的评论:

      此补丁在 *addhi3 和 addhi3_clobber 中添加了一个“w”替代项 为了投票给“w”类。这类似于原始的 addhi3 insn 到版本 4.6.在 addhi3_clobber 中没有更明确的对“l”的投票,它只是“r”。
      目的是更好地使用 ADIW 和 SBIW 指令。

      所以“w”是一个与 AVR 相关的约束。

      【讨论】:

        猜你喜欢
        • 2010-12-12
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        相关资源
        最近更新 更多