如何在GCC中编写.syntax统一UAL ARMv7内联汇编?

时间:2019-01-07 16:23:58

标签: gcc arm inline-assembly armv7

我想编写统一的程序集,以消除在Is the hash required for immediate values in ARM assembly?上提到的字面量之前的讨厌的#

这是带有#的最小非统一代码:

#include <assert.h>
#include <inttypes.h>

int main(void) {
    uint32_t io = 0;
    __asm__ (
        "add %0, %0, #1;"
        : "+r" (io)
        :
        :
    );
    assert(io == 1);
}

它可以编译并在QEMU下正常运行:

arm-linux-gnueabihf-gcc -c -ggdb3 -march=armv7-a -pedantic -std=c99 -Wall -Wextra \
  -fno-pie -no-pie -marm -o 'tmp.o' 'tmp.c'

如果我尝试删除#,则代码将失败,并显示以下信息:

/tmp/user/20321/ccoBzpSK.s: Assembler messages:
/tmp/user/20321/ccoBzpSK.s:51: Error: shift expression expected -- `add r3,r3,1'

符合预期,因为默认情况下不统一。

该如何工作?

我找到了有前途的选择:

gcc -masm-syntax-unified

但是添加它没有帮助。

如果我改写:

".syntax unified; add %0, %0, #1;"

然后它起作用了,但是我必须为每个不实际的__asm__做一次。

UI还发现,如果没有-marm,它确实会使用统一汇编,但是会生成我不想要的拇指代码。

也许此错误是问题的根本原因:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648

在arm-linux-gnueabi-gcc 5.4.0,Ubuntu 18.04中进行了测试。

1 个答案:

答案 0 :(得分:0)

Devs很快再次回答了该问题:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648#c3,并在以下位置提交了一个补丁:https://github.com/gcc-mirror/gcc/commit/2fd2b9b8425f9fc4ad98d48a0ca41b921dd75bd9(8.2.0之后)太棒了!