【问题标题】:How to write .syntax unified UAL ARMv7 inline assembly in GCC?如何在 GCC 中编写 .syntax 统一的 UAL ARMv7 内联汇编?
【发布时间】:2019-06-02 08:06:19
【问题描述】:

我想编写统一的程序集来摆脱在我的文字前面的讨厌的#,如: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,那么它确实使用了统一汇编,但是它会生成拇指代码,这是我不想要的。

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

在 arm-linux-gnueabi-gcc 5.4.0、Ubuntu 18.04 中测试。

【问题讨论】:

  • 这是一个长镜头,但是:有时命令行中后面的选项可以覆盖早期的选项。你把-masm-syntax-unified 放在哪里了?此外,如果您确实添加了 .syntax unified 东西,大概您必须在完成后将其放回原处。似乎您可以将字符串包装在宏中,但这至少与使用 #1 一样难看。
  • @DavidWohlferd 谢谢,我应该早点尝试。显然它与-marm 不兼容,这可能是一个 GCC 错误。更新的问题。

标签: gcc arm inline-assembly armv7


【解决方案1】:

开发人员很快再次回复该问题:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88648#c3,并在以下位置提交了一个补丁:https://github.com/gcc-mirror/gcc/commit/2fd2b9b8425f9fc4ad98d48a0ca41b921dd75bd9(发布 8.2.0)修复了-masm-syntax-unified。太棒了!

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多