【问题标题】:Comment syntax ambiguity under GAS ARM targetGAS ARM 目标下的注释语法歧义
【发布时间】:2020-04-16 16:55:37
【问题描述】:

GNU GAS 文档似乎无法为 ARM 目标正确定义某些语法特性,因此我什至难以编写简单的程序集。

两个这样的例子:

  • ARM Compiler Migration and Compatibility Guide Version 6.02 声明,以及多行 cmets,在 GNU 语法下:

    // 标记将一行的剩余部分标识为注释:

    MOV R0,#16 // Load R0 with 16

    这似乎与Using as 指南相冲突,该指南指出:

    在一行的任何地方出现“@”表示注释的开头延伸到该行的末尾。

  • 指令中的隐式转换问题仅在 Arm 文档中传递,并且仅给出失败的情况:

    GNU 语法汇编要求立即值以编码形式呈现。指令MOVK x1, #0x40000 产生以下消息:error: immediate must be an integer in range [0, 65535].

    “编码”到底是什么意思?我是否假设在 GNU 下同样支持 LSL 语法? GAS 文档中似乎没有解决它。

在哪里可以找到 GAS + ARM 目标的具体和完整的语法定义? 提前致谢。

【问题讨论】:

    标签: assembly arm gnu-assembler


    【解决方案1】:

    GAS 支持 // cmets 和 @ cmets 本身,即使不使用 C 预处理器来处理 C/C++ 样式的 cmets。

    (调用你的文件foo.S,用大写的S和gcc -c foo.S将首先通过CPP运行它,所以你可以使用#define#if 0之类的东西。)

    “编码”表示可以用机器代码表示。例如MOVK x1, #0x40000 不是 syntax 错误,它是在解析之后出现的错误,因为无法使用该操作码在机器码中表示该特定数字。但是mov x1, #0x40000 很好,因为汇编器可以为orr-immediate 和xzr 选择位范围编码。请注意,这是 AArch64,它使用与 ARM 不同的机器代码。

    GAS ARM 语法与官方 ARM 手册文档相同。 指令 与 Keil 的 ARMasm 不同,但指令行的语法(大部分?)是相同的。 @old_timer 表示 mrcmcr 语法存在或存在一些差异,但在大多数情况下,GAS 旨在与标准 ARM 语法兼容。

    请参阅 GAS 手册的 ARM Dependent Features 章节,包括语法部分。

    (请注意,ARM 有几种不同的语法模式,“统一”与旧的使用不同语法的 ARM 与 Thumb 模式。通常你想要.syntax unified

    您始终可以查看 GCC C 编译器输出的示例(例如,https://godbolt.org/z/Tk_jrD),尽管对于特定情况,您必须编写一个 C 函数,其中 GCC 将使用您感兴趣的指令或寻址模式. GCC 使用 GAS 指令。

    【讨论】:

    • 您好,谢谢。我没有意识到 .S 启用了 CPP 预处理——这很好。那么我是否可以假设我可以在 GAS 下写 STR R0, [R3, R2, LSL #2] ?这是我正在努力解决的任何地方似乎都没有定义的确切允许的语法。那么,GAS 是否在很大程度上适应了官方的 ARM 语法?
    • @BenjaminCrawfordCtrl-Alt-Tut - 用arm-none-eabi-as 组装对我来说很好,arm-none-eabi-objdump -de7830102 结果反汇编回该指令。除了指令之外,ARM GAS 语法通常与 ARMasm 匹配。我不知道有什么例外。
    • gas arm 汇编语言与这个问题清楚地表明的 arm 手册非常不同。汇编语言是由汇编程序而不是目标定义的,gnu 倾向于使其与供应商工具不兼容(除非选择使用 gnu 作为他们的主要工具)。您需要阅读 gnu 文档。请注意,如果您使用编译器来组装东西(为什么?为什么?为什么?),那么这是在顶部添加的全新语法,因为如果您在 gnu 汇编语言前面使用 gcc,它现在是 C。更令人困惑的事情。
    • @old_timer:我说过指令是不同的。你能举一个真正的 instruction 助记符 + 操作数的例子,当它们都处于统一语法模式时,GAS 和 Keil 之间的组合方式不同(或根本不组合)?
    • 像 ldr r0,=blah 这样的伪指令在所有汇编器上的行为并不相同,gas 非常灵活,无论是 mov、mvn 还是 pc 相关的 ldr,它都可以正常工作。但是有一个问题,它不适用于使用非 gnu 的人,不记得那是哪个汇编程序。但这是一条伪指令,不是 arm 的语法。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多